如何使用 Roslyn 在 C# 中添加新运算符
本文关键字:添加 运算符 何使用 Roslyn | 更新日期: 2023-09-27 17:57:05
我正在尝试在C#中实现类似DSL的功能。它可能看起来类似于 LINQ 查询。我想知道是否可以使用 Roslyn 实现新的一元或二进制运算符。
最近几天我一直在谷歌上搜索,但没有多大成功。如果有人能指出我一些示例或 Roslyn 文档,那就太好了。
有两种
方法可以使用 Roslyn 实现基于 C# 的新语言。
使用 Roslyn API 将源代码解析为语法树,然后将语法树转换为实际的 C# 并进行编译。
如果你的语言实际上是语法上有效的 C# 代码,但语义不同,则这是理想的选择。例如,
await
如果您强制await
看起来像函数调用(例如await(x)
是有效的,但不是await x
)。如果要引入新语法(如新运算符),它可能会起作用,因为 Roslyn 确实支持解析"损坏"的代码。但它很可能不能很好地工作,因为这样语法树可能看起来不像你想要的那样。更糟糕的是,结果可能不一致(有时,您的新语法将以一种方式解析,有时以另一种方式解析)。
由于 Roslyn 现在是开源的,因此您实际上可以以任何您想要的方式修改编译器的源代码,包括添加新运算符。
但这样做很可能并不简单。而且我认为工作流也会更加复杂:您需要编译自己的编译器版本,而不仅仅是使用 NuGet 中的库,如选项 1 中所示。