4

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

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

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

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

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

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

?

4

3 回答 3

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相似但不兼容的。

于 2012-04-20T09:28:24.583 回答
3

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

于 2012-04-20T09:29:26.140 回答
3

即使它们兼容,它们也不是同一类型。

您需要“投射”它:

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

我通常只是这样做:

var query = names.Where(x => d(x))
于 2012-04-20T09:33:05.943 回答