4

デリゲートを定義して、このようにクエリを記述できます。

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

?

4

3 に答える 3

3

互換性があっても、これらは同じタイプではありません。

それを「キャスト」する必要があります:

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

私は通常、次のことを行います。

var query = names.Where(x => d(x))
于 2012-04-20T09:33:05.943 に答える
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>andDは似ていますが互換性がありません。

于 2012-04-20T09:28:24.583 に答える
3

これFunc<TSource, TResult>は、署名が同じであっても、2 つの異なるデリゲート型 (およびデリゲート型でもある) が異なる型と見なされるためです。

于 2012-04-20T09:29:26.140 に答える