【问题标题】:Compiler Directive for detecting C# 8/nullable reference types用于检测 C# 8/可为空引用类型的编译器指令
【发布时间】:2020-04-09 01:51:52
【问题描述】:

是否有 C# 8 的编译器指令或检测是否设置了 <nullable>enable</nullable>

我有一个只有源代码的 Nuget 包,它可以帮助处理可空引用类型的故事。如果设置了,我想有条件地设置#nullable enable指令,例如:

#ifdef ICANHASNULLABLE
#nullable enable
#endif

#ifdef ICANHASNULLABLE
string Foo(string? val)
#else
string Foo(string val)
#endif

我有各种使用 .NET Core 2.1 SDK 构建的东西,并且正在努力将这些东西带到 .NET Core 3.1,尽管速度很慢,而不仅仅是通过翻转开关。该指令仅指向框架版本,而不是语言版本。

【问题讨论】:

    标签: c# roslyn c#-8.0 nullable-reference-types


    【解决方案1】:

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

    <PropertyGroup>
        <TargetFrameworks>netcoreapp2.2;netcoreapp3.1</TargetFrameworks>
    </PropertyGroup>
    

    您可以添加一个特定于netcoreapp3.1 的条件PropertyGroup 并定义您自己的常量:

    <PropertyGroup Condition="'$(TargetFramework)'=='netcoreapp3.1'">
        <DefineConstants>ICANHASNULLABLE</DefineConstants>
        <Nullable>enable</Nullable>
    </PropertyGroup>
    

    你也可以根据&lt;Nullable&gt;定义你的指令:

    <PropertyGroup Condition="'$(Nullable)'=='enable'">
        <DefineConstants>ICANHASNULLABLE</DefineConstants>
    </PropertyGroup>
    

    在您的代码中,您可以使用ICANHASNULLABLE:

    #if ICANHASNULLABLE
    void Foo(string? val)
    #else
    void Foo(string val)
    #endif
    {
    }
    

    Default language version for netcoreapp 3.x is C# 8.0。因此,如果未设置 LangVersion,则上述示例中为 netcoreapp3.1 专门定义的任何 PropertyGroup 都可以被视为特定于 C# 8.0。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-18
      • 2020-03-23
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 2020-10-07
      • 2020-04-19
      相关资源
      最近更新 更多