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