可为空的引用类型的注释只能在“ #nullable”内容内的代码中使用

时间:2019-04-03 09:53:21

标签: c# c#-8.0

只需下载VS2019并创建一个控制台应用即可尝试新的C#8空引用类型。将项目切换为使用lang ver C#8构建(当前显示为beta)

然后下面的代码将导致警告。

 class Program
    {
        static void Main(string[] args)
        {
            string? message = "Hello World";
            string message2 = null;

            Console.WriteLine(message);
            Console.WriteLine(message2);

            // The annotation for nullable reference types should only be used in code within a '#nullable' content
        }
    }

这实际上是什么意思?

3 个答案:

答案 0 :(得分:9)

对于任何在这里结束的人。 您可以将#nullable enable放在文件顶部,以实现@Marc在注释中建议的逐个文件的方法。

您还可以使用#nullable启用/禁用的组合来仅注释文件的一部分

class Program
{
    static void Main(string[] args)
    {
#nullable enable
        string? message = "Hello World";
#nullable disable
        string message2 = null;

        Console.WriteLine(message);
        Console.WriteLine(message2);
    }
}

这是文档的链接。 https://docs.microsoft.com/en-us/dotnet/csharp/nullable-references#nullable-contexts

  

可空上下文可以对以下内容进行细粒度控制   编译器如何解释引用类型变量。 可为空   任何给定源行的注释上下文enableddisabled。   您可以将C#8之前的编译器视为将所有代码编译为   disabled可为空的上下文:任何引用类型都可以为空。的   可为空的警告上下文可以设置为enableddisabled或   safeonly。可为空的警告上下文指定警告   由编译器使用其流分析生成。

     

可为空的注释上下文和可为空的警告上下文可以是   使用您的Nullable元素为项目设置   csproj个文件。该元素配置编译器如何解释   类型的可空性以及生成什么警告。有效设置   是:

     
      
  • enable启用了可空注释上下文。可为空   警告上下文已启用。引用类型的变量,例如string是不可为空的。启用了所有可空性警告。
  •   
  • disable:可空注释上下文已禁用。可为空的警告上下文已禁用。引用类型的变量是忽略的,就像C#的早期版本一样。所有可空性警告均已禁用。
  •   
  • safeonly启用了可空注释上下文。可为空的警告上下文为仅安全。引用类型的变量不可为空。启用了所有安全性为空的警告。
  •   
  • warnings:可空注释上下文已禁用。可为空的警告上下文已启用。引用类型的变量是忽略的。启用所有可空性警告。
  •   
  • safeonlywarnings:可空注释上下文已禁用。可为空的警告上下文为仅安全。引用类型的变量是忽略的。启用所有安全性为空的警告。
  •   
     

您还可以使用指令在项目中的任何地方设置这些相同的上下文:

     

#nullable enable:将可为空的注释上下文和可为空的警告上下文设置为已启用

     

#nullable disable:将可为空的注释上下文和可为空的警告上下文设置为已禁用

     

#nullable safeonly:将可为空的注释上下文设置为启用,将警告上下文设置为仅安全

     

#nullable restore:将可为空的注释上下文和可为空的警告上下文还原到项目设置。

     

#pragma warning disable nullable:将可为空的警告上下文设置为已禁用

     

#pragma warning enable nullable:将可为空的警告上下文设置为已启用

     

#pragma warning restore nullable:将可为空的警告上下文恢复为项目设置。

     

#pragma warning safeonly nullable:将可为空的警告上下文设置为仅安全

     

默认的可为空的注释和警告上下文为   disabled。该决定意味着您现有的代码无需   进行更改,并且不会产生任何新警告。

     

enabledsafeonly可空警告上下文之间的区别是用于将可空引用分配给不可空引用的警告。

或者要在整个项目中启用此功能,您需要添加

 <Nullable>enable</Nullable>

到您的项目文件。

应该是这样的:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <LangVersion>8.0</LangVersion>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>

并将这些警告转换为错误-添加

<WarningsAsErrors>CS8600;CS8602;CS8603</WarningsAsErrors>

到您的项目文件

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <LangVersion>8.0</LangVersion>
    <Nullable>enable</Nullable>
    <WarningsAsErrors>CS8600;CS8602;CS8603</WarningsAsErrors>
  </PropertyGroup>

</Project>

CS8600:将空文字或可能的空值转换为不可空类型。

CS8602:可能会取消引用空引用。

CS8603:可能返回空引用。

答案 1 :(得分:1)

我也遇到了同样的错误,并且花了几天时间来解决它,原因是其他答案没有描述:Roslyn C#编译器中有特殊的规则(未记录?),用于生成 的代码使用可为空的功能,并且在我将Visual Studio 2019升级到最新版本(16.4+)之前,错误消息与上面的消息完全相同,尽管我的项目文件中包含<Nullable>enabled</Nullable>

但是在最新版本的Visual Studio 2019中,他们已将错误消息升级为:

  

警告CS8669:可为空的引用类型的注释仅应在“ #nullable”注释上下文中的代码中使用。 自动生成的代码需要在源代码中使用明确的“ #nullable”指令。

(强调已添加到错误消息的新添加的部分。)

因此,如果您在发出的任何.generated.cs文件中看到此错误消息,则这些文件需要明确地添加#nullable enable -罗斯林显然总是忽略生成代码的项目级<Nullable>enable</Nullable>设置。

答案 2 :(得分:0)

如果您想抑制可空警告,只需从“ErroList”面板复制警告代码并右键单击相应项目并转到“属性”,从左侧单击“构建”,然后将该警告代码放入“禁止警告:”,在分号后:

enter image description here