Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有语句体的lambda表达式无法转换为表达式树_C#_.net_Compiler Construction_Design Decisions - Fatal编程技术网

C# 具有语句体的lambda表达式无法转换为表达式树

C# 具有语句体的lambda表达式无法转换为表达式树,c#,.net,compiler-construction,design-decisions,C#,.net,Compiler Construction,Design Decisions,关于语句体表达式,StackOverlow上有几个问题。我只是想知道为什么用C语言做不到这一点?(为什么没有在编译器中实现它的复杂性在哪里?) 有来自@eric lippert的消息。对语句体表达式转换有类似的解释吗 更新(根据Jon Skeet的回答): 我的用例是在运行时轻松翻译C代码转换的可能性。我只想知道在哪里有大量的努力?编译器应该已经在编译过程中构建了一些类似的表达式树——或者是否存在类似infoof的隐藏复杂性?表达式树最初是为LINQ创建的,它是关于查询的。查询通常是基于函数的,

关于语句体表达式,StackOverlow上有几个问题。我只是想知道为什么用C语言做不到这一点?(为什么没有在编译器中实现它的复杂性在哪里?)

有来自@eric lippert的消息。对语句体表达式转换有类似的解释吗

更新(根据Jon Skeet的回答):


我的用例是在运行时轻松翻译C代码转换的可能性。我只想知道在哪里有大量的努力?编译器应该已经在编译过程中构建了一些类似的表达式树——或者是否存在类似infoof的隐藏复杂性?

表达式树最初是为LINQ创建的,它是关于查询的。查询通常是基于函数的,因此单表达式lambda非常适合,而不需要担心表达式树中的控制流等。我怀疑将任意语句lambda的表达式树转换为SQL等将是一件愚蠢的事情

NET 4的表达式树后来得到了增强(我相信这主要是为了DLR),但C#4编译器实际上不需要为此从lambda表达式创建复杂的表达式树——因此,主要是因为没有足够的好处使其值得

换一种说法:您的用例是什么,可以证明包含它可能需要花费大量的精力?也许有这样一个用例,也许在C#的未来版本中,团队会认为这是值得的。但就目前而言,能够将表达式lambda转换为表达式树有一个明显的好处——但是为语句lambda做同样的工作并没有相应的好处

编辑:C#编译器完全没有理由需要代码的表达式树表示(根据
System.Linq.Expressions
),但它将有一个抽象语法树


我怀疑你真正想要的是——它仍然在CTP中,但它基本上是一个编译器API。Roslyn AST的设计目的不是在与表达式树相同的场景中使用,但是如果您对编译器转换感兴趣,它可能仍然是您想要的。

AST和.NET表达式之间的区别在哪里?将AST转换为另一棵树(在本例中为.NET表达式)并不是一项很大的工作,或者是吗?因为从我(用户)的角度来看,少了一小部分大部分工作已经完成了,还是没有?但我理解你的理由:对于LINQ用户来说更复杂,而额外的工作没有多少好处。-据我所知,它们可能不像infoof那样是一种隐藏的复杂性。(因此,我应该在Roslyn可用之前使用NRefactory。)@TN:老实说,我怀疑将Roslyn AST转换为表达式树将是一项相当大的工作。我建议您试试看:)Roslyn团队考虑使用“语句”表达式树(旁白:回想起来,称它们为表达式树显然是一个错误;它们应该是“代码树”,因为“语句表达式树”没有意义)作为内部实现细节或外部格式,并拒绝了两者。它们不包含使Roslyn正常工作所需的所有信息,而且改装它们的成本很高。