c# - lambda->表达式树转换过程是否在任何地方指定?

标签 c# .net linq language-specifications

在 C# 中编译 LINQ 查询有两个重要步骤。第一个是将 LINQ 查询语法转换为方法调用链,如 C# 语言规范第 7.16 节所述。此转换过程的详细说明使得语言开发人员可以使用它在新的 CLR 语言上实现类似的查询语法。

第二步是将 lambda 表达式转换为表达式树,这发生在调用返回 IQueryable 的查询方法时,而不是调用返回 IEnumerable 的方法时。是否指定了这种转换是如何发生的,类似于查询语法转换过程的解释?

最佳答案

实际上,表达式树的构造明确定义。编译器开发人员可以自由使用他们希望的任何方法,当然前提是执行表达式产生与调用 lambda 相同的结果。

这是引用自 C# 语言规范:


6.5.2 匿名函数转换为表达式树类型的评估

将匿名函数转换为表达式树类型会生成表达式树(§4.6)。更准确地说,对匿名函数转换的评估导致构造一个对象结构,该对象结构表示匿名函数本身的结构。 表达式树的精确结构,以及创建它的确切过程,都是由实现定义的。


我在末尾添加了粗体。

我怀疑这是故意未指定的,以便编译器开发人员可以自由实现他们认为有用的任何优化。表达式树的严格规范会阻止这种情况。

关于c# - lambda->表达式树转换过程是否在任何地方指定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26748755/

相关文章:

c# - Expression<Func<T,TResult>>.Compile() 的反转?

C# 按名称对 FileInfo 数组进行排序,得到一些意想不到的结果,需要知道是否有其他可用的排序选项

c# - 读取 Dependency walker 输出

C# 动态 MenuStrip(不接触窗体)

c# - 从路径中获取所有嵌套文件夹名称(无路径)

c# - 通用类型转换

c# - 将简单的 SelectMany 转换为查询语法

c# - 通用列表的扩展方法

c# - 有理数结构的默认值

c# - 在同一项目(SQL Server 和 MySql)中使用具有多个数据库和提供程序的 Entity Framework