在现代 C# 中,可以为引用类型的变量分配 null 值,还是不能?

In modern C#, can reference-typed variables be assigned the null value, or can't they?

一段时间以来,我一直在尝试理解可空引用类型的含义,但我仍然感到困惑。我的理解是,在可为空的上下文中,您不应该能够这样做:

TestClass nonNullable = null;
public class TestClass { }

我认为您应该需要将引用类型声明为可为空的,以便能够在可为空的上下文中为其分配 null 值,如下所示:

TestClass? nullable = null;

当我在net5.0 或net6.0 中编译第一个代码块时,将项目文件中的Nullable 节点设置为“enabled”,我得到的只是一个编译器警告CS8600。除此之外,一切似乎都一样。但是,据我所知,可空引用类型与旧库相比是一个巨大的突破性变化。为什么?我已阅读有关此主题的 Microsoft API 参考资料:Nullable reference types,以及两本书中的章节。我观察到的行为似乎违反了 Microsoft 的规范。要么是我傻,要么是解释inaccurate/unclear,要么两者兼而有之。

是的,可以为任何可为空的上下文中的引用变量分配空值。

“可空”和“non-nullable”引用变量在这里可能是误导性术语,因为它们仅指示编译器是否应为给定变量生成 警告

上下文本身被称为“可空”并且启用它会使引用变量在该上下文中-可空,这也有点令人困惑,除非您另有说明。

TLDR:启用某些版本的可空上下文功能以在编译时生成相关警告 - 仅此而已。

附带说明一下,如果您真的想根据这些警告阻止您的构建,则需要采取额外的步骤。请参阅此相关答案: