用于检测C#8/可空引用类型的编译器指令

用于检测C#8/可空引用类型的编译器指令,c#,roslyn,c#-8.0,nullable-reference-types,C#,Roslyn,C# 8.0,Nullable Reference Types,是否有针对C#8的编译器指令或检测是否设置了enable 我有一个源代码专用的Nuget包,它可以帮助解决可空引用类型的问题。如果设置了#nullable enable指令,我希望有条件地设置该指令,例如: #ifdef ICANHASNULLABLE #nullable enable #endif 及 我用.NET Core 2.1 SDK构建了一系列东西,我正在努力将这些东西带到.NET Core 3.1中,尽管速度很慢,而且不仅仅是通过切换。该指令只指向框架版本,而不是语言版本。假设您有

是否有针对C#8的编译器指令或检测是否设置了
enable

我有一个源代码专用的Nuget包,它可以帮助解决可空引用类型的问题。如果设置了
#nullable enable
指令,我希望有条件地设置该指令,例如:

#ifdef ICANHASNULLABLE
#nullable enable
#endif


我用.NET Core 2.1 SDK构建了一系列东西,我正在努力将这些东西带到.NET Core 3.1中,尽管速度很慢,而且不仅仅是通过切换。该指令只指向框架版本,而不是语言版本。

假设您有一个多目标应用程序。在
.csproj
文件中:

<PropertyGroup>
    <TargetFrameworks>netcoreapp2.2;netcoreapp3.1</TargetFrameworks>
</PropertyGroup>
您还可以根据
定义指令:

<PropertyGroup Condition="'$(Nullable)'=='enable'">
    <DefineConstants>ICANHASNULLABLE</DefineConstants>
</PropertyGroup>
。因此,如果未设置
LangVersion
,则上述示例中专门为
netcoreapp3.1
定义的任何
PropertyGroup
都可以被视为特定于C#8.0

<PropertyGroup Condition="'$(TargetFramework)'=='netcoreapp3.1'">
    <DefineConstants>ICANHASNULLABLE</DefineConstants>
    <Nullable>enable</Nullable>
</PropertyGroup>
<PropertyGroup Condition="'$(Nullable)'=='enable'">
    <DefineConstants>ICANHASNULLABLE</DefineConstants>
</PropertyGroup>
#if ICANHASNULLABLE
void Foo(string? val)
#else
void Foo(string val)
#endif
{
}