这是原来的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&lt; T,T&gt;与会代表。所以在
Func<Developer, bool> filteringPredicate = d => d.Language == "C#";
众所周知,d是Developer类型,返回类型是bool。同样,对于
Func<Developer, string> selectionPredicate = d => d.Name;
知道d是Developer类型,返回类型是string。但是,在以下有效形式的同一查询中,如何推断出这些类型:
IEnumerable<string> developersUsingCSharp =
developers
.Where(d => d.Language == "C#")
.Select(d => d.Name);
答案 0 :(得分:3)
编译器知道developers
实现IEnumerable<Developer>
。这意味着IEnumerabler<T>
之外的任何developers
扩展名都会包含Developer
类型的项目。
答案 1 :(得分:1)
编译器知道developers
中的元素是Developer
s,因此它可以推断出两个lambdas的第一个类型参数。编译器可以通过检查lambdas的返回值来推断第二个类型的参数:bool
的{{1}}和Where
的{{1}}。
答案 2 :(得分:0)
我真的没有在那里看到一个问题;但是,请看一下C#规范的第7.5.2节。我包含描述如何执行匿名和通用方法解析和类型推断的小节。