2012-04-20 16 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

2つの異なるデリゲートタイプ(およびFunc<TSource, TResult>もデリゲートタイプです)は、シグニチャが同じであっても異なるタイプとみなされるからです。

2

これらは互換性があっても同じ種類ではありません。

は、あなたはそれを「キャスト」する必要があります。

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

私は通常ちょうど行います

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

実際SO彼らの目的を達成する助けた人だけ笑 – toddmo