为 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()
将生成的代码添加到编译中(context
是 GeneratorExecutionContext
传递给生成器的 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);
我目前正在 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()
将生成的代码添加到编译中(context
是 GeneratorExecutionContext
传递给生成器的 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);