3

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

@eric-lippert对 memberof/infoof有很好的解释。语句体表达式转换有类似的解释吗?

更新(基于乔恩斯基特的回答):

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

4

1 回答 1

4

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

后来针对 .NET 4 增强了表达式树(我相信主要是为了 DLR),但 C# 4 编译器实际上并不需要为此从 lambda 表达式创建复杂的表达式树 - 所以主要是没有足够的好处让它值得。

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

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

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

于 2013-05-08T21:22:11.320 回答