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;
}
因此,构造函数也不会被调用。
编译器在这里使用一些合成糖吗?
答案 0 :(得分:2)
type? t = null;
被编译器识别并替换为type? t = new type?()
,后者将调用默认构造函数,该构造函数将对象设置为全零。属性HasValue
由boolean
变量支持,因此在这种情况下false
是正确的初始值。
在几乎每个地方,这些构造都被视为对type
类型对象的引用。为了观察它们不是,您需要一个可变的struct
。编译器以多种方式了解type?
,包括在装箱和装箱到HasValue
或装箱的null
时检查type
属性。如果您设法获得装箱的type?
,则拆箱员应该能够处理它,但是除非您正在编写{{1},否则似乎没有办法再获得装箱的type?
了。 }函数。