在where子句中委派

时间:2012-04-20 09:22:26

标签: linq delegates where-clause lambda

我可以定义一个委托并像这样编写查询。

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

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

我的问题是,如果Func<T, TResult>是一个以字符串作为参数并返回bool的委托,为什么我不能说:

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

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

3 个答案:

答案 0 :(得分: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;
  

错误1无法将类型'Program.D'隐式转换为'Program.F'

扩展方法Where定义为

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

所以你需要一个Func<string, bool>D相似但不兼容。

答案 1 :(得分:3)

这些类型不同,即使它们兼容。

你需要“施放”它:

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

我通常只是这样做:

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

答案 2 :(得分:2)

这是因为两种不同的委托类型(和Func<TSource, TResult>也是委托类型)被认为是不同的类型,即使它们的签名是相同的。