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

时间:2014-04-07 15:00:40

标签: c# roslyn

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

最近几天我一直在谷歌搜索没有太大的成功。如果有人能指出我的一些样本或Roslyn文件,那就太好了。

1 个答案:

答案 0 :(得分:9)

有两种方法可以使用Roslyn来实现一种新的基于C#的语言。

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

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

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

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

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