一个带有语句主体的 Lambda 表达式无法转换为表达式树。

3
在StackOverlow上有几个关于语句体表达式的问题。我想知道为什么在C#中不可能做到这一点?(实现起来有多复杂,为什么编译器没有实现?)
@eric-lippert在这里对memberof/infoof有很好的解释。是否有类似的解释适用于语句体表达式转换?
更新(基于Jon Skeet的答案):
我的用例是在运行时轻松地翻译C#代码变换的可能性。我只想知道哪里需要大量的工作?编译器应该已经在编译过程中构建了一些类似的表达式树——或者说存在着像infoof那样的隐藏复杂性吗?
1个回答

4
表达式树最初是为LINQ创建的,与查询有关。查询通常是基于函数的,因此单个表达式lambda非常适合,无需担心表达式树中的控制流等。我认为将任意语句lambda翻译成SQL等可能是徒劳无功的。
后来增强了.NET 4的表达式树(我认为主要是为了DLR),但C# 4编译器实际上不需要从lambda表达式创建复杂的表达式树,因此它大多数情况下并没有足够的好处,值得投入这么多的精力。
换句话说:您的用例是什么,能够证明为其包含它所需的大量工作肯定吗?也许确实存在这样的用例,也许在C#的未来版本中,团队会决定值得这样做。但就目前而言,能够将表达式lambda转换为表达式树具有明显的好处,但同样为语句lambda做同样的事情的额外工作并没有相应的好处。
编辑:C#编译器绝对没有必要具有代码的表达式树表示(以System.Linq.Expressions为代表),但它将具有抽象语法树。
我怀疑您真正想要的是Roslyn - 它仍然处于CTP阶段,但基本上是一个编译器API。 Roslyn AST的设计不适用于与表达式树相同的场景,但如果您对编译器转换感兴趣,它可能仍然是您想要的内容。

AST和.NET表达式之间有什么区别?将AST翻译成另一个树(在本例中为.NET表达式)并不需要太多的工作量,或者说需要吗?因为从用户的角度来看,只缺少一小部分?-- 大部分工作已经完成了,还是没有? - TN.
但我理解你的原因:对于LINQ用户来说更加复杂,而且额外的工作并没有太多好处。-- 所以据我所知,它们可能不是一个隐藏的复杂性,不像infoof那样。(因此,在Roslyn可用之前,我应该使用NRefactory。) - TN.
@TN:老实说,我怀疑从Roslyn AST转换到表达式树可能需要相当大的工作量。我建议你尝试一下并找出答案 :) - Jon Skeet
Roslyn团队曾考虑使用“语句”表达式树(顺便说一下:回想起来称它们为表达式树显然是一个错误;它们应该被称为“代码树”,因为“语句表达式树”没有意义)作为内部实现细节或外部格式,并拒绝了两者。它们不包含使Roslyn工作所需的所有信息,而且将其改造成本高昂。 - Eric Lippert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接