【问题标题】:What does the "Nullable context" actually do?“可空上下文”实际上是做什么的?
【发布时间】:2022-04-04 07:51:38
【问题描述】:

我看过 C# 的 nullable contexts 的文档,但有一些我不明白的地方:

是否为任何代码段启用可为空的上下文只会使其在 null 可能分配给“不应为空”类型时开始显示警告?

我的印象是它会告诉编译器“我保证这不会为空,所以闭嘴。”但似乎相反? “让我知道什么时候可以为空,因为我很偏执。”?

是吗?

【问题讨论】:

  • 文档似乎对此非常清楚。 #nullable 只允许您选择加入新行为。它本身不会做任何事情来将事物标记为(不可)超出引用类型的可空值,然后默认为不可空值(因此您可以使用? 将它们标记为可空值)。注释负责其余的工作。当可空上下文被禁用时,编译器根本不会给出任何关于可能是 null 的警告。
  • @JeroenMostert,如果文档清楚,我就不会问了。而且,老实说,在我看来,您似乎没有理解或阅读我的问题,因为您的评论属于一般领域,但没有表达我的意思。上下文是否只启用警告?
  • #nullable warnings 只是启用警告。 #nullable enable 启用警告以及可为空的注释以使这些警告消失。因为这就是文档所说的字面意思,所以我会接受我没有理解你的意思。如果您将#nullable 视为打开允许 进行可空性检查的功能并且与告诉编译器(自己)什么无关,也许它会有所帮助事情可以是null。特别是,打开 NRT 不会进入某种不可能出现异常的“可证明不是null 模式”;设计师们的野心太大了。
  • @JeroenMostert,是的,我想最后我们互相理解了,谢谢!

标签: c# nullable nullable-reference-types


【解决方案1】:

微软在 C# 8 中引入了“可空感知上下文”。

在可空感知上下文中:

  • 引用类型 T 的变量必须用非空值初始化, 并且可能永远不会被分配一个可能为空的值。
  • 引用类型 T 的变量?可以用 null 或初始化 分配为 null,但需要在之前检查 null 取消引用。
  • T 类型的变量 m?申请时被认为是非空的 容错运算符,如 m!。

不可空引用类型 T 和可空引用类型 T 的区别?由编译器对上述规则的解释强制执行。 T 类型的变量和 T 类型的变量?由相同的 .NET 类型表示。

Nullable reference types

例子:

string notNull = "Hello";
string? nullable = default;
notNull = nullable!; // null forgiveness

可以使用项目文件中的<nullable>enable</nullable 或禁用属性来打开和关闭此功能。由于该功能默认是禁用的,因此也可以移除该属性来禁用它。

Nullable contexts

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <Nullable>enable</Nullable>
  </PropertyGroup>

附加信息:

Learn techniques to resolve nullable warnings

Update a codebase with nullable reference types to improve null diagnostic warnings

【讨论】:

    猜你喜欢
    • 2011-03-17
    • 2011-03-11
    • 2010-11-26
    • 2015-06-23
    • 2017-12-26
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多