我们知道可以将null赋值给可空类型。例如:
我们知道第二个语句是可行的,因为我们被告知它是可行的,我们只接受了它,没有问为什么。但如果你看一下
我们可以将一个
根据隐式转换运算符的规则,
Nullable<Int32> x = 2021;
Nullable<Int32> y = null;
我们知道第二个语句是可行的,因为我们被告知它是可行的,我们只接受了它,没有问为什么。但如果你看一下
Nullable<T>
的源代码是这样的: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<Int32>
,例如Nullable<Int32> x = 2021;
,这是因为有隐式转换运算符的存在,它允许我们将int
隐式转换为Nullable<Int32>
。根据隐式转换运算符的规则,
T
作为=
右侧的操作数时,必须是一个结构体类型。但是,null
显然不是一个合法的结构体值,那么我们如何执行Nullable<Int32> y = null;
(更不用说Nullable<Int32>
本身就是一个结构体了),而且为什么它不违反隐式转换运算符的规则呢?
null
和可空值类型之间的位的说明。Nullable<T>
非常特殊,因为它甚至具有运行时支持:int? x = null; object o = x
将一个空引用赋给o
,而不是装箱的Nullable<T>
,并且拆箱操作也类似。 - undefined