可空类型
可空类型可以表示基础类型的所有值以及 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>