“Nullable context” 到底是做什么的?

4
我看过 C# 的可空上下文 nullable contexts 文档,但有一些东西我不明白:
启用任何代码的可空上下文只会在 null 可以分配给“不应该为 null”的类型时开始显示警告吗?
我原本以为它会告诉编译器“我保证这不会是 null,所以别管它。”,但它似乎相反?“让我知道什么时候可能为空,因为我很神经质。”?
就是这样吗?

5
这份文档对此非常清楚。 #nullable 只是允许您选择加入新的行为。 它本身并没有将事物标记为可空或不可空,除了参考类型默认为不可空之外(因此您可以使用 ? 标记它们为可空)。 注释会处理其余部分。 当禁用可空上下文时,编译器将不会对可能为 null 的事物发出任何警告。 - Jeroen Mostert
1
@JeroenMostert,如果文档写得清楚,我就不会问了。而且,说实话,你似乎没有理解或读懂我的问题,因为你的评论只是在一般范围内,而没有抓住我的重点。上下文是否仅启用警告? - user14092802
3
#nullable warnings 仅启用警告。 #nullable enable 启用警告以及可空注释,从而消除这些警告。由于这正是文档所说的,我接受我没有理解您的要点。也许如果您把 #nullable 视为打开允许进行可空性检查的功能,而与向编译器(单独)告知哪些内容可以为 null 无关,可能会有所帮助。特别地,打开 NRTs 不会进入某种“可证明不为 null 模式”,在那里异常是不可能的;设计者认为这太过雄心。 - Jeroen Mostert
@JeroenMostert,是的,我认为最终我们彼此理解了,谢谢! - user14092802
1个回答

2

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

“在可空上下文中:

  • 引用类型T的变量必须使用非null值进行初始化,并且永远不能分配可能为null的值。
  • 引用类型T?的变量可以使用null进行初始化或赋值,但在取消引用之前需要检查是否为null。
  • 类型为T?的变量m在应用null-forgiving运算符(如m!)时被视为非null。

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

可空引用类型

示例:

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

这个功能可以通过项目文件中的<nullable>enable</nullable或disable属性来开启和关闭。由于该功能默认是禁用的,因此可以将属性移除以禁用它。

可空上下文

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

附加信息:

学习解决可空警告的技巧

更新具有可空引用类型的代码库以改善空诊断警告


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接