2010-12-31 2 views
-1

편리한 확장 메서드를 사용하여 LINQ 쿼리를 실행하려는 BindingList <T>의 사용자 지정 하위 클래스가 있습니다. 예를 들면 :BindingList의 사용자 정의 하위 클래스 인 IEnumerable <T> 확장 메서드에 액세스하려면 어떻게해야합니까? <T>?

public int GetSum(MyList<T> list) 
{ 
    return list.Sum(x => x.Value); 
} 

그러나 컴파일러는 분명히하는 그 것이다, IEnumerable<T>list을 인식하지 못하기 때문에이 작품 있기 때문에, Sum를 해결할 수없는 불평 :

public int GetSum(MyList<T> list) 
{ 
    return ((IEnumerable<T>)list).Sum(x => x.Value); 
} 

누구나가 못 생기고 불필요한 캐스트를 피할 수있는 영리한 방법?

답변

1

컴파일러가 Sum이 유추 할 수 없으므로 수행하려고 시도하는 형식 인수에 대해 불평 할 수 있습니다. 다음과 같이 type 인수를 지정할 수 있습니다. 여기서 T는 Sum을 수행하려는 유형입니다.

return list.Sum<T>(x => x.Value); 

는 형식 인수를 설정하지 않고 기본 BindingList<T>에 되 돌리는 경우에도 귀하의 샘플 중 어느 것도 나를 위해 컴파일합니다 그러나 주목해야한다.

+0

그럴 것입니다 .... 형식 상 여러 개의 IEnumerable 구현이 있다고 생각합니까? – Dan

+0

@Dan 귀하의 합계 (x => x.Value) x.Value는이 표현식이 모든 객체에서 무언가에 대해 평가할 수있는 기능을 제거합니다. 제대로 평가하려면 Value 속성이 있어야하는 형식을 지정하고 있습니다. Sum 확장 메서드의 형식 인수 내에 형식을 지정하지 않으면 식을 계산하는 방법을 알 수 없습니다. –

관련 문제