2

元のLinqは次のとおりです。

       var developersUsingCSharp =
                from d in developers
                    where d.Language == "C#"
                    select d.Name;

これは次のように記述できます。

     Func<Developer, bool> filteringPredicate = d => d.Language == "C#";
     Func<Developer, string> selectionPredicate = d => d.Name;
     IEnumerable<string> developersUsingCSharp =
                    developers
                         .Where(filteringPredicate)
                         .Select(selectionPredicate);

上で Func <T,T> デリゲートを明示的に定義しました。だから

     Func<Developer, bool> filteringPredicate = d => d.Language == "C#";

d は Developer 型で、戻り値の型は bool であることがわかっています。同様に、

     Func<Developer, string> selectionPredicate = d => d.Name;

d は Developer 型であり、戻り値の型は文字列であることがわかっています。ただし、同じクエリの有効な形式に従うと、これらの型はどのように推測されますか。

IEnumerable<string> developersUsingCSharp =
                      developers
                         .Where(d => d.Language == "C#")
                         .Select(d => d.Name);
4

3 に答える 3

3

コンパイラdevelopersはimplementsを知っていますIEnumerable<Developer>。これは、IEnumerabler<T>から離れたすべての拡張子developersがタイプ のアイテムを持つことを意味しますDeveloper

于 2012-08-03T20:43:27.320 に答える
1

コンパイラは の要素developersDevelopers であることを認識しているため、両方のラムダの最初の型引数を推測できます。コンパイラは、ラムダboolの戻り値を調べることにより、2 番目の型引数を推測できます。WherestringSelect

于 2012-08-03T20:45:33.257 に答える
0

そこに質問はありません。ただし、C# 仕様のセクション 7.5.2 を見てください。I には、匿名およびジェネリック メソッドの解決と型推論がどのように実行されるかを説明するサブセクションが含まれています。

于 2012-08-03T20:43:51.143 に答える