“可为空上下文”实际上是做什么的?

问题描述 投票:0回答:1

我已经看过 C# 的可空上下文的文档,但有一些我不明白的地方:

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

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

是这样吗?

c# nullable nullable-reference-types
1个回答
0
投票

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

在可空感知上下文中:

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

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

可为空的引用类型

如果启用了可空感知上下文并且在声明变量时未分配任何值,则会给出以下警告:

“CS8618 - 退出构造函数时,不可为空的变量必须包含非空值。考虑将其声明为可空。”

CS8618-不可空引用未初始化

示例:

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

可以使用项目文件中的

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

可空上下文

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

附加信息:

学习解决可为空警告的技术

使用可为空的引用类型更新代码库以改进空诊断警告

© www.soinside.com 2019 - 2024. All rights reserved.