可空类型

可空类型可以表示基础类型的所有值以及 null

语法 T?Nullable<T> 的简写

可以为 Nullable 的值实际上是 System.ValueType 对象,因此它们可以装箱和取消装箱。此外,可空对象的 null 值与参考对象的 null 值不同,它只是一个标志。

当可空的对象装箱时,空值被转换为 null 引用,并且非空值被转换为非可空的底层类型。

DateTime? dt = null;
var o = (object)dt;
var result = (o == null); // is true

DateTime? dt = new DateTime(2015, 12, 11);
var o = (object)dt;
var dt2 = (DateTime)dt; // correct cause o contains DateTime value

第二条规则导致了正确但矛盾的代码:

DateTime? dt = new DateTime(2015, 12, 11);
var o = (object)dt;
var type = o.GetType(); // is DateTime, not Nullable<DateTime>

简短形式:

DateTime? dt = new DateTime(2015, 12, 11);
var type = dt.GetType(); // is DateTime, not Nullable<DateTime>