2016-07-05 3 views
1

익명의 함수를 익명의 함수로 바꾸고 싶을 때까지 항상 익명의 함수가 강력한 함수라고 생각했습니다. 단 하나의 메서드 본문 만이이 함수를 호출해야하기 때문입니다. 일반의 예 : 익명 함수가 아닌 익명의 함수

public void Init(List<int> numbers, List<string> texts) 
{ 
    int n = GetFirst(numbers); 
    string t = GetFirst(texts); 
} 

private T GetFirst<T>(List<T> list) 
{ 
    return list[0]; 
} 

이 원하는

GenFunc<T, List<T>, T> getFirst = list => list[0]; 

사용 같은 것을 정의하는 것 대신 인스턴스 방법 GetFirst의. Func을 사용하는 것은 일반 매개 변수가 다른 의미를 가지기 때문에 불가능합니다. 따라서 I 대리자 (Func의 "기본")

delegate T GetFirstDelegate<T>(List<T> list); 

정의하지만 단지 일반적인 정의 매개 변수를 들면 인스턴스화 할

GetFirstDelegate<string> getFirst = list => list[0]; 

하지만 난 자리 제네릭 매개 변수에 원치 같이

GetFirstDelegate<T> getFirst = list => list[0]; 

이 날 익명 메소드라는 이름의 방법뿐만 mightly 아니라는 것을 생각하게한다 - 적어도 일반적인 사용의 관점에서 - 또는 AM 나는 무엇인가 놓친다?

+0

, 대한 예를 들어, LINQ는 이미 IEnumer에'.First()'를 정의하고있다. able ' –

답변

1

Func<List<T>, T> getFirst<T> = list => list[0]; 

같은 일반적인 변수을 만드는 것입니다 그러나 변수는 일반적인 될 수 없기 때문에 불행히도이 유효하지 않은 C#을입니다. 형식 (인터페이스, 클래스, 구조체), 대리자 및 메서드 만 generic 일 수 있습니다.

2

this 질문을 보면 C#에서는 일반적인 익명의 기능을 사용할 수 없다는 것을 알 수 있습니다. 컴파일러가 일반 제네릭 메소드와 관련되어있을 때 이미징. 실제로 호출 된 각 유형에 대해 과부하를 생성합니다 (최소한 단순함). generic 매개 변수로 변수를 선언하면이 경우 컴파일러는 어떻게해야합니까? 다른 일반 매개 변수로 새 변수를 생성 할 수 없습니다.

희망이 있습니다. 당신은 기본적으로 일반적인 메소드와 클래스가 컴파일 타임의 것임을 알아야합니다! 당신이 실제로 일을하려고 무엇

0

List<T>을 입력으로 받아들이고 T을 반환하는 함수의 서명은 Func<List<T>, T>이고 Func<T, List<T>, T>이 아닙니다.

나는 이것이 당신이 원하는 것을 생각 :

private Func<List<T>, T> GenGetFirst<T>() 
{ 
    return list => list[0]; 
} 

사용법 :

public void Init(List<int> numbers, List<string> texts) 
{ 
    int n = GenGetFirst<int>()(numbers); 
    string t = GenGetFirst<string>()(texts); 
} 

또는 더 명확 방법으로 : 물론

public void Init(List<int> numbers, List<string> texts) 
{ 
    Func<List<int>, int> intFunc = GenGetFirst<int>(); 
    Func<List<string>, string> stringFunc = GenGetFirst<string>(); 

    int n = intFunc(numbers); 
    string t = stringFunc(texts); 
} 
+0

답을 고맙게 생각하지만, 명명 된 메서드를 없애고 방금 배운 것처럼 C#에서는 불가능한 익명의 함수로 표현하고 싶습니다. – David

관련 문제