2014-04-19 2 views
2

그래서 위의 내용을 이해하지 못했습니다. 마찬가지로확장 일반 매개 변수와 Func 인수 일반 매개 변수 간의 관계

public static TElement StringMatch<TElement, TData>(
     this IEnumerable<TElement> source, 
     Func<TElement, TData> selector) 

모든 여기 괜찮습니다 .... 당신이 그렇게 같은 열거 형에 확장자를 가진 가정,하지만 난 StringMatch 일반적인 매개 변수는 Func<> 무엇을하기 때문에, Func을 일반적인 매개 변수를 반영한다고 가정했습니다 전달 될 사용자에게 표시됩니다.

그러나 내가 Func<>의 반환 형식은 어쩌면

Func<TElement, string>처럼 특정 매개 변수로 지정하고 싶은 말은 이제 내 생각은 ...

public static TElement StringMatch<TElement, string>(
      this IEnumerable<TElement> source, 
      Func<TElement, string> selector) 

과 같이 서명을 변경하는 것입니다. ..again, 통과 된 Func <>을 비추는 것. 내가 Books.StringMatch(b => b.Title) 같은에서이 작업을 호출하려고하면, 나는

'Book' does not contain a definition for 'StringMatch' and no extension method 'StringMatch' accepting a first argument of type 'Book' could be found (are you missing a using directive or an assembly reference?) 

그래서 거래는 여기에 무슨 ...과 같은 오류 얻을? 무엇 정확히 확장 메서드에서 제네릭 매개 변수를 지정합니까? 당신이

public static TElement StringMatch<TElement, TData>(
    this IEnumerable<TElement> source, 
    Func<TElement, TData> selector) 

이 있으면

+0

"TData"라는 형식을 찾기 위해 컴파일러에 요청하기 때문에 두 번째 서명이 컴파일되지 않습니다. 제네릭 메서드 정의에 포함시키지 않으므로 컴파일러는 TData가 제네릭 형식 매개 변수가되어야한다는 것을 모릅니다. 어쩌면 나는 정말로 뭔가 빠졌지 만, StringMatch에서 원하는 것을 정교하게 만들 수 있습니까? – Vincent

+0

죄송합니다. 지금 실수로 편집 중입니다 ... – MassStrike

답변

3

그것은 TDatastring이다 호출자가 Func을 전달하는 경우를 포함한다.

당신이 원하는 경우 TData 항상 단순히 방법에 정식 일반적인 매개 변수로 그것을 제거 특정 유형의 string 할 수 있습니다 : 당신은, 물론, 모두를 구현할 수

public static TElement StringMatch<TElement>(
    this IEnumerable<TElement> source, 
    Func<TElement, string> selector) 

. 컴파일러는 가장 구체적인 것을 선택합니다. 호출자는 유형 매개 변수를 명시 적으로 지정하여 하나의 선택 만 남겨 둘 수 있습니다.

+0

좋아, 그럴 듯 해. 따라서 확장 메서드의 제네릭 매개 변수는 확장하는 열거 형을 포함하지 않고 해당 메서드에 대한 인수에 포함 된 모든 일반 매개 변수를 포함하기 만합니까? 제 생각에 나에게 혼란 스럽다는 것은 제네릭 인수와 Func 매개 변수가 동일한 구문을 사용한다는 것입니다. 2 개의 Func 매개 변수로 인해 2 개의 일반 매개 변수가 있어야한다고 생각했습니다. – MassStrike

+2

메서드 또는 대리자 이름 뒤에 오는 매개 변수는 형식 매개 변수 선언입니다. 클래스/인터페이스 선언에서 클래스/인터페이스 이름 뒤에있을 수도 있습니다. 다른 모든 요소는 해당 클래스/인터페이스에 대한 참조입니다. 반환 유형, 매개 변수 유형 또는 유형이 사용되는 본문의 모든 위치에서 사용할 수 있습니다. (사용하지 않을 수도 있습니다.) –