【问题标题】:Are there built-in "simplifications" with Roslyn?Roslyn 有内置的“简化”吗?
【发布时间】:2012-07-15 17:44:01
【问题描述】:

是否有任何内置方法可以使用 Roslyn 执行与 C# 编译器相同的编译时转换,例如用于将迭代器、初始化器、lambda、LINQ 等转换为基本的 C# 代码?

【问题讨论】:

    标签: c# roslyn


    【解决方案1】:

    Roslyn 编译器 API 旨在(除了将源代码转换为 IL)允许您构建源代码分析和转换工具。

    但是,lambda 和迭代器没有始终可以使用 source 指定的翻译。它们使用内部绑定节点抽象建模,其中包括只能使用 IL 表示的额外编译器特定规则。

    在 C# 中将 LINQ 转换为源代码是可能的,因为它被指定为源代码转换(无论编译器实际上是否这样做)。但是,没有专门执行此操作的编译器 API。如果有,它可能会显示为服务层 API,而不是编译器 API。

    【讨论】:

    • 我知道你对迭代器的看法是对的,异常处理是以 C# 无法表达的方式完成的,但是 lambdas 需要什么不能用 C# 来表达? (编辑:当然,除了使用在 C# 中无效的名称。可以使用任何名称。)
    • 是什么让迭代器无法在 C# 中表达?他们不只是陈述普通机器吗?
    • @Mehrdad:John Skeet 在csharpindepth.com/articles/chapter6/… 上有一篇很好的关于它们是如何实现的文章。特别是,我们有时会生成跨越 C# 中通常不允许的事物的 goto。
    • @JasonMalinowski:啊,我明白了,我没有意识到某些 goto 是非法的。 :-) 谢谢!
    【解决方案2】:

    AFAIK,不,Roslyn 中没有这样的事情。但是编译器必须以某种方式进行这些转换,因此您可以通过访问一些 internal 方法来完成此操作。

    当然,您可以使用 Roslyn 自己进行这些转换,但这不是您要的。

    【讨论】:

    • +1 该死,谢谢。似乎有它的文档(LambdaRewriter?)但整个类都是内部的!
    • 它似乎也在使用像BoundNode 这样的东西,这也是内部的。 :(
    • 你可以通过反射使用internal的东西,只是不太方便。
    • 是的,但弄清楚如何使用它们是第一个障碍。
    猜你喜欢
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    相关资源
    最近更新 更多