Linq如何从Lambda推断类型

本文关键字:类型 Lambda Linq | 更新日期: 2024-09-22 15:09:15

这是原始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类型,返回类型是string。然而,在以下相同查询的有效形式中,这些类型是如何推断的:

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

Linq如何从Lambda推断类型

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

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

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