首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >只能在“# nullable”上下文中的代码中使用可为only的引用类型的批注

只能在“# nullable”上下文中的代码中使用可为only的引用类型的批注
EN

Stack Overflow用户
提问于 2019-04-03 17:53:21
回答 2查看 69.8K关注 0票数 117

刚刚下载了VS2019并创建了一个控制台应用程序来试用新的C# 8空引用类型。将项目切换为使用lang ver C# 8构建(目前显示为测试版)

然后,下面的代码将产生一个警告。

代码语言:javascript
运行
复制
 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' context
        }
    }

这到底是什么意思?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-03 18:04:36

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

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

代码语言:javascript
运行
复制
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

可空上下文允许对编译器如何解释引用类型变量进行细粒度控制。任何给定源代码行的可空注释上下文被启用或禁用。您可以将C# 8.0之前的编译器视为在禁用的可空上下文中编译所有代码:任何引用类型都可能为空。还可以启用或禁用可空警告上下文。可空的警告上下文指定由编译器使用其流分析生成的警告。

可以使用.csproj文件中的nullable元素为项目设置可空注释上下文和可空警告上下文。此元素配置编译器如何解释类型的可空性以及生成哪些警告。有效设置为:

  • enable
    • 启用了可为空的注释上下文。可以为空的警告上下文是引用类型的enabled.
    • Variables,例如,string是不可为空的。所有可为空性警告均为enabled.

  • warnings
    • 可空注释上下文已禁用。可以为空的警告上下文是引用类型的enabled.
    • Variables。所有可为空性警告均为enabled.

  • annotations
    • 启用了可为空的注释上下文。可以为空的警告上下文是引用类型的disabled.
    • Variables,例如,string是不可为空的。所有可为空性警告均为disabled.

  • disable
    • 可空注释上下文已禁用。可以为空的警告上下文是引用类型的disabled.
    • Variables,就像早期版本的C#一样。所有可为空性警告均为disabled.

在您的.csproj文件中,只需在相关的<PropertyGroup>元素中添加<Nullable>enable</Nullable> (对于每个项目配置名称,您的项目文件可能有单独的<PropertyGroup>元素)。

因此,您的项目文件应如下所示:

代码语言:javascript
运行
复制
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>

要将可为空的消息显示为错误而不是警告,请将以下内容添加到项目文件中:

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

...like so:

代码语言:javascript
运行
复制
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <Nullable>enable</Nullable>
    <WarningsAsErrors>CS8600;CS8602;CS8603</WarningsAsErrors>
  </PropertyGroup>

</Project>

对应的完整消息为:

null type.

  • CS8602: CS8600:将null文字或可能的null值转换为不可为null的值可能取消对null的引用,并可能返回null引用。

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

  • #nullable enable:将可空注释上下文和可空警告上下文设置为enabled.
  • #nullable disable:将可空注释上下文和可空警告上下文设置为disabled.
  • #nullable restore:将可空注释上下文和可空警告上下文恢复为项目settings.
  • #nullable disable warnings:将可空警告上下文设置为disabled.
  • #nullable enable warnings:将可空警告上下文设置为enabled.
  • #nullable restore warnings:将可空警告上下文恢复为项目settings.
  • #nullable disable annotations:将可为空的批注上下文设置为disabled.
  • #nullable enable annotations:将可为空的批注上下文设置为enabled.
  • #nullable restore annotations:将批注警告上下文恢复为项目设置。

默认情况下,可空注释和警告上下文处于禁用状态。这意味着您的现有代码无需更改即可编译,也不会生成任何新的警告。

请注意,C# 8.0和Visual Studio2019的预发布版本也支持safeonly,但最终发布的C# 8.0中没有this option has since been removed和。此外,预发布版本使用#pragma warning restore nullable,但发布版本使用#nullable restore warnings

票数 177
EN

Stack Overflow用户

发布于 2019-12-24 03:50:18

我也遇到了同样的错误,我花了几天的时间与之抗争,原因是其他答案没有描述:有特殊的(未记录的?)在我将Visual Studio2019升级到最新版本(16.4+)之前,尽管我的项目文件中有<Nullable>enabled</Nullable>,但错误消息与上面的毫无帮助的消息完全相同。

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

警告CS8669:可为only的引用类型的批注应仅在“# nullable”批注上下文中的代码中使用。自动生成的代码需要在源代码中显式地使用‘#nullable’指令。

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

因此,如果你在你正在发送的任何.generated.cs文件中看到这个错误消息,那么这些文件需要显式地添加#nullable enable - Roslyn显然总是忽略生成代码的项目级<Nullable>enable</Nullable>设置。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55492214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档