他们在.Net 3.5中。我知道他们在4.0中,因为这是DLR的工作方式,但我对我们现在拥有的版本感兴趣。
答案 0 :(得分:21)
在C#3.0规范的早期草案中,表达树的部分边缘有一条评论说:
我有一个关于图灵完整性的真正奇妙的证据,这个边缘太窄而无法包含。
可悲的是,没有人能够找出是谁写的或开发证据。
答案 1 :(得分:4)
如果没有定义将执行树的东西,我们不知道。在CLR自己的解释中(当你将它们编译成代表时)它们是。但是如果你将它们翻译成SQL,它们就不是,你可以用你喜欢的任何属性发明你自己对它们的混淆解释。
在你决定如何解释它们之前,它们只是数据结构。
答案 2 :(得分:2)
LINQ表达式树可以表示您可以放在普通C#表达式中的任何内容。因此,它们不能用于直接表示while
循环,for
循环等。
但是,理论上可以使用lambda表达式和递归来执行您可能需要的任何迭代。在实践中,将Enumerable
方法放入树中可能更容易。
答案 3 :(得分:1)
但是,表达树只代表一个表达式,因此你必须定义你允许做什么,如Earwicker所述。
如果允许表达式树使用递归,则可以实现重复,即循环等。
然而,无类型的lambda演算是Turing-complete Turing_completeness#例子但是Lambda演算本身不允许递归Lambda_calculus #Recursion它都非常冒险。
我会得出结论,表达可能是图灵完成的,但需要有更熟悉这一点的人才能确认。