为 Roslyn SyntaxFactory 指定语言版本

Specify language version for Roslyn SyntaxFactory

我目前正在 netstandard2.0 库中使用 Roslyn 构建 C# 源代码生成器。在 .csproj 中,我引用了以下 Roslyn 包:

<ItemGroup>
    <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.0.1" />
    <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.3" />
</ItemGroup>

源代码生成器使用 Roslyn 的 SyntaxFactory 创建附加代码。然后它使用 context.Compilation.AddSyntaxTrees() 将生成的代码添加到编译中(contextGeneratorExecutionContext 传递给生成器的 Execute 方法)。

问题是我在调用 AddSyntaxTrees() 时得到以下异常:

System.ArgumentException: Inconsistent language versions. Parameter name: syntaxTrees

我明白异常的原因。 SyntaxFactory 创建的语法树的语言版本设置为 CSharp10。但是编译上下文的语言版本设置为CSharp8.

有没有办法告诉 SyntaxFactory 它应该生成的语言版本?

我知道我也可以使用 Microsoft.CodeAnalysis.Analyzers 的 3.7 版(根据 this table)。但这是否也不会阻止我使用最新的 Roslyn 功能(虽然不确定那可能是什么)。此外,我如何确定使用源代码生成器的目标库只会使用相同的语言版本进行编译?或者对于不同的语言版本,我需要不同版本的源代码生成器吗?另外 - 这在不同的 IDE 中会有所不同吗?

创建 SyntaxTree 时,您可以使用 ParseOptions 参数设置其语言版本。

var options = CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.CSharp8);
var syntaxTree = SyntaxFactory.SyntaxTree(root, options);

SyntaxFactory.SyntaxTree