2012-04-20 104 views
4

我可以定義一個委託並像這樣寫查詢。代表在where子句中

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... 

回答

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被定義爲

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

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

2

這是因爲兩個不同的委託類型(並且Func<TSource, TResult>也是委託類型)被視爲不同的類型,即使它們的簽名是相同的。

2

即使它們兼容,它們也不是同一類型。

你需要以「鑄造」吧:

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

我通常只是做:

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

,實際上幫助了SO完成其目標的唯一的人笑 – toddmo 2014-08-30 20:55:20