我可以定义一个委托并像这样编写查询。
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...
答案 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>
也是委托类型)被认为是不同的类型,即使它们的签名是相同的。