源生成器应以 .NET Standard 2.0 为目标。这是支持 .NET Framework 的最后一个 .NET Standard 版本。最新 .NET Framework 版本中的默认 C# 版本是 C# 7.3。
假设源生成器应该由在其使用项目中使用 C# 7.3 的 .NET Framework 用户使用。生成的源代码是否需要为 C# 7.3,或者是否可以进一步推动它并避免需要较新版本的 .NET 的语言功能?
具体来说,我对以下 C# 8 及以上功能感兴趣:
ref readonly
参数(in 参数理论上可以工作)(C# 12)由于源生成器将源输出到使用的项目/程序集中,生成的源将使用 C# 7.3 功能进行编译。有什么办法可以绕过它吗?我们可以用其他 C# 版本编译特定文件吗?或者可以将源生成器输出到全新的程序集并以某种方式通知编译器有关依赖项的信息(这可能不起作用,因为部分类型必须在程序集中完全定义)?
编辑1: 我正在使用增量源生成器,而不是 ISourceGenerator。
代码生成器实现本身必须面向 .NET Standard 2.0,但可以使用您想要的任何 C# 版本。我了解您的问题与生成代码的 C# 版本有关,该版本低于或等于当前 C# 项目的版本。
您的代码生成器实现可以使用以下代码读取当前的 C# 版本:
public static LanguageVersion GetLanguageVersion( this Compilation compilation )
{
var tree = compilation.SyntaxTrees.FirstOrDefault();
if ( tree == null )
{
return LanguageVersionFacts.MapSpecifiedToEffectiveVersion( LanguageVersion.Default );
}
return ((CSharpParseOptions) tree.Options).LanguageVersion;
}
您的实现可以根据当前 C# 版本的需要动态生成代码。