Linq如何推断Lambda的类型

时间:2012-08-03 20:38:30

标签: c# linq delegates lambda extension-methods

这是原来的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);

3 个答案:

答案 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节。我包含描述如何执行匿名和通用方法解析和类型推断的小节。