2012-04-20 3 views
4

델리게이트를 정의하고 이와 같은 쿼리를 작성할 수 있습니다. Func<T, TResult> 대리자가 인수로 문자열을 복용하고 부울을 반환하는 경우where 절의 델리게이트

Func<string, bool> filter = s => s.Length == 5; 

IEnumerable<string> query = names.Where(filter)         
           .Select(x => x.ToUpper()); 

내 질문입니다, 왜 내가 말할 수 없습니다

delegate bool D(string s); 
D d = new D(delegate(string s) { return s.Length == 1; }); 

IEnumerable<string> query = names.Where(d).Select... 

?

답변

3

그들은 다른 유형이기 때문에.

오류의 같은 종류주는 짧은 버전 :

delegate bool D(string s); 
delegate bool F(string s); 

D d = new D(delegate(string s) { return s.Length == 1; }); 
F f = d; 

Error 1 Cannot implicitly convert type 'Program.D' to 'Program.F'

그리고 확장 메서드 Where 당신이 Func<string, bool>D이 유사하다 필요 그래서

Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate); 

으로 정의되지 않고, 호환 가능.

2

두 개의 다른 대리자 형식 (및 Func<TSource, TResult>도 대리자 형식 임)은 서명이 동일해도 서로 다른 형식으로 간주되기 때문입니다.

2

호환되는 경우에도 동일한 유형이 아닙니다.

당신은 그것을 "캐스트"해야

var query = names.Where(new Func<string, bool>(d)) 

나는 대개 수행

var query = names.Where(x => d(x)) 
+0

실제로는 SO 자신의 목적을 달성 도움이 유일한 사람 롤 – toddmo