Nullable<T>
类型定义为struct
。在.Net中,您无法将null
分配给struct
,因为structs
是无法用null
表示的值类型(Nullable<T>
除外) )。
int i = null; // won't compile - we all know this
int? i = null; // will compile, and I'm glad it does, and it should compile, but why?
Nullable<T>
如何成为规则的例外“您无法将null
分配给值类型?” Nullable<T>
的反编译代码没有提供有关如何发生这种情况的见解。
答案 0 :(得分:13)
Nullable<T>
如何成为规则的例外“你不能将null分配给值类型?”
通过改变语言,基本上。 null
字面值从“空引用”变为“相关类型的空值”。
在执行时,可空值类型的“空值”是HasValue
属性返回false
的值。所以这个:
int? x = null;
相当于:
int? x = new int?();
值得将Nullable<T>
的框架部分与语言和CLR方面分开。事实上,CLR本身并不需要了解可空值的类型 - 据我所知,唯一重要的方面是可空值类型的空值被装箱为空引用,你可以unbox对任何可空值类型的null值的null引用。即使这只是在.NET 2.0最终版本发布之前引入的。
语言支持主要包括:
?
形式的句法糖因此int?
相当于Nullable<int>
null
??
) - 不限于可空值类型