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

编译器知道developersimplements IEnumerable<Developer>。这意味着任何IEnumerabler<T>扩展都developers将具有类型的项目Developer

于 2012-08-03T20:43:27.320 回答
1

编译器知道其中的元素developersDevelopers,因此它可以推断出两个 lambda 的第一个类型参数。编译器可以通过检查 lambda 的返回值来推断第二种类型的参数:bool对于Wherestring对于Select.

于 2012-08-03T20:45:33.257 回答
0

我真的没有看到任何问题。但是,请查看 C# 规范的第 7.5.2 节。我包含描述如何执行匿名和通用方法解析和类型推断的小节。

于 2012-08-03T20:43:51.143 回答