Nullable <t> = null如何工作?

时间:2018-07-01 23:57:25

标签: c#

int? num = null;

它是如何工作的?我一直以为Nullable是一个类,今天我在调试时很惊讶地看到它是一个结构。我检查了源代码,发现了这个隐式运算符:

[System.Runtime.Versioning.NonVersionable]
public static implicit operator Nullable<T>(T value) 
{
    return new Nullable<T>(value);
}

这显然不是答案,因为null不是int。另外构造函数是这样的:

[System.Runtime.Versioning.NonVersionable]
public Nullable(T value) 
{
    this.value = value;
    this.hasValue = true;
} 

因此,构造函数也不会被调用。

编译器在这里使用一些合成糖吗?

1 个答案:

答案 0 :(得分:2)

type? t = null;

被编译器识别并替换为type? t = new type?(),后者将调用默认构造函数,该构造函数将对象设置为全零。属性HasValueboolean变量支持,因此在这种情况下false是正确的初始值。

在几乎每个地方,这些构造都被视为对type类型对象的引用。为了观察它们不是,您需要一个可变的struct。编译器以多种方式了解type?,包括在装箱和装箱到HasValue或装箱的null时检查type属性。如果您设法获得装箱的type?,则拆箱员应该能够处理它,但是除非您正在编写{{1},否则似乎没有办法再获得装箱的type?了。 }函数。