StackOverlow 上有几个关于语句体表达式的问题。我只是想知道为什么在 C# 中不能做到这一点? (复杂性在哪里,为什么没有在编译器中实现?)
@eric-lippert 对memberof/infoof有很好的解释。语句体表达式转换有类似的解释吗?
更新(基于 Jon Skeet 的回答):
我的用例是可以在运行时轻松翻译 C# 代码转换。我只想知道大量的努力在哪里?编译器在编译过程中应该已经构建了一些类似的表达式树——或者是否存在像 infoof 的情况那样隐藏的复杂性?
查询有关。查询通常是基于函数的,因此单表达式 lambda 非常适合,无需担心表达式树等中的控制流。我怀疑将任意语句 lambda 的表达式树转换为 SQL 等将是一个愚蠢的差事。
后来针对 .NET 4 增强了表达式树(我相信主要是为了 DLR),但 C# 4 编译器实际上并不需要为此从 lambda 表达式创建复杂的表达式树 - 所以主要是没有没有足够的好处值得这样做。换句话说:您的用例是什么,可以证明包含它可能需要付出大量的努力?也许存在这样的用例,也许在 C# 的未来版本中,团队会认为这是值得的。但就目前而言,能够将表达式 lambda 转换为表达式树具有明显的好处 - 但对语句 lambda 执行相同操作的额外工作并没有相应的好处。
编辑:C# 编译器绝对没有理由需要有代码的表达式树表示(就System.Linq.Expressions
将会
有一个抽象语法树。我怀疑你真正想要的是
Roslyn - 它仍然在CTP中,但它基本上是一个编译器API。 Roslyn AST 的设计目的并非与表达式树在相同的场景中使用,但如果您对编译器转换感兴趣,它很可能仍然是您想要的。