提问者:小点点

是什么使可为空的类型可以赋值为空?


我们知道我们可以将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赋给nullablenullablex=2021;的原因是由于隐式运算符,它允许您隐式强制转换int为nullable。根据隐式运算符的规则,t作为=的右手边,必须是结构类型,但null显然不是合法的结构值,那么如何做nullabley=null;(更不用说nullable本身就是一个结构),为什么不违反隐式运算符规则


共1个答案

匿名用户

检查null以及将null赋值给nullable类型的变量是编译器显式覆盖的。

所以

int? i = ...
if (i == null) ...

转换为

if (i.HasValue)

而且

i = null;

转换为

i = default(Nullable<int>);

默认值(nullable)分配“空”(零初始化)nullable。因此,它的hasvalue属性为false,这是int?null的语义等价物。