我们知道我们可以将null赋给可为null的类型。例如:
Nullable<Int32> x = 2021;
Nullable<Int32> y = null;
我们知道第二种说法是有效的,因为有人告诉我们它是有效的,我们只是接受它,而不问为什么。但如果查看nullable
的源代码,则为:
public struct Nullable<T> where T : struct {
...
public static implicit operator Nullable<T>(T value) {
return new Nullable<T>(value);
}
public static explicit operator T(Nullable<T> value) {
return value.Value;
}
}
我们可以将int
赋给nullable
为nullable
的原因是由于隐式运算符,它允许您隐式强制转换int为nullable
。根据隐式运算符的规则,t
作为=
的右手边,必须是结构类型,但null
显然不是合法的结构值,那么如何做nullable
(更不用说nullable
本身就是一个结构),为什么不违反隐式运算符规则
检查null
以及将null
赋值给nullable
类型的变量是编译器显式覆盖的。
所以
int? i = ...
if (i == null) ...
转换为
if (i.HasValue)
而且
i = null;
转换为
i = default(Nullable<int>);
而默认值(nullable
分配“空”(零初始化)nullable
。因此,它的hasvalue
属性为false
,这是int?
为null
的语义等价物。