为什么 Nullable<T> 结构允许“null”?

3

Nullable是一个结构体。我知道结构体不能被赋值为“null”。那么我们如何将Nullable对象赋值为null?原因是什么?


1
可能是为什么Nullable<T>是一个结构体?的重复问题。 - V4Vendetta
1
@ Nolonar:为什么要这样做?我的意思是,如何将结构对象分配为空?结构对象无法被分配为空。而 Nullable<T> 本身就是一个结构体。 - Sadiq
你必须遵守的规则不一定是编译器和CLR所遵循的规则。 - Damien_The_Unbeliever
@Sadiq,你也可以阅读这篇文章:https://dev59.com/h2zXa4cB1Zd3GeqPSlo0#13980357 - V4Vendetta
@ Damien:你的意思是它在CLR层面上处理吗? - Sadiq
1
根据p.s.w.g的回答,当对这样一个变量表面赋值为null时,可能会发生一些奇妙的事情- 你无法在C#中为自己的类编写的奇迹。 - Damien_The_Unbeliever
1个回答

10

它实际上不接受null的值;它只是有一些语法糖,使它能够像null一样"行事"。该类型实际上看起来有点像这样:

struct Nullable<T>
{
    private bool hasValue;
    private T value;
}

当它被初始化时,hasValue == false,并且value == default(T)

当你编写以下代码时:

int? i = null;

C#编译器实际上正在幕后执行以下操作:

Nullable<T> i = new Nullable<T>();

在运行时将null转换为int?时,也会进行类似的检查。

更多阅读


我认为他想知道为什么可以使用 DateTime? test = null 这样的id。 - MarcinJuraszek
@ MarcinJuraszek:是的..这就是我的意思。或者可能是因为Nullable<T>重载了运算符。像==运算符??不确定。 - Sadiq
1
@Sadiq 它确实覆盖了 Equals 方法。但是 int? test = null 实际上更像是编译器的技巧。我在我的答案中包含了更详细信息的链接。 - p.s.w.g

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