c# - 如何使用 Roslyn 在 C# 中添加新运算符

标签 c# roslyn

我正在尝试在 C# 中实现类似于 DSL 的功能。它可能看起来类似于 LINQ 查询。我想知道是否可以使用 Roslyn 实现新的一元或二元运算符。

最近几天我一直在谷歌搜索,但没有太大的成功。如果有人可以向我指出一些示例或 Roslyn 文档,那就太好了。

最佳答案

您可以通过两种方式使用 Roslyn 来实现基于 C# 的新语言。

  1. 使用 Roslyn API 将源代码解析为语法树,然后将语法树转换为实际的 C# 并进行编译。

    如果您的语言实际上是语法上有效的 C# 代码,但语义不同,则这是理想的选择。例如,如果您强制 await 看起来像一个函数调用(例如 await(x) 将是有效的),您可以通过这种方式实现 await , 但不是 await x).

    如果您想引入新的语法(如新的运算符),它可能会起作用,因为 Roslyn 确实支持解析“损坏的”代码。但它很可能不会很好地工作,因为那样的话语法树可能看起来不像你想要的那样。更糟糕的是,结果可能不一致(有时,您的新语法将以一种方式解析,有时以另一种方式解析)。

  2. 由于 Roslyn 现在是开源的,您实际上可以以任何您想要的方式修改编译器的源代码,包括添加一个新的运算符。

    但要做到这一点很可能并不简单。而且我认为工作流程也会变得更加复杂:您需要编译自己版本的编译器,而不是像选项 1 中那样仅使用 NuGet 中的库。

关于c# - 如何使用 Roslyn 在 C# 中添加新运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22916098/

相关文章:

.net - 为 Roslyn 分析器提供依赖项的正确方法是什么?

c# - Roslyn CTP 是否仍可用于 Visual Studio 2010 SP1

c# - 到处查找枚举转换为字符串

C# 流程自动化

c# - 在 ASp.net 中动态添加数据到 gridview

c# - system.data.function' 由于其保护级别而无法访问

c# - 如何按wpf中的后续数字对数组列表进行排序?

c# - 只比较 DateTime C# 中的日期

c# - 如何在没有 "not found to remove"异常的情况下获取重命名类的语义模型

typescript - 如何使用 VSIX 中的 GetSyntaxRoot 获取 Typescript 作为 FileCodeModel 或 (Roslyn) 文档