您是否尝试过使用该Convert.ChangeType()方法将值转换为Nullable<T>类型?尴尬的是,它会抛出InvalidCastException一句话:"空对象无法转换为值类型".
尝试在您的即时窗口上运行此操作: ?System.Convert.ChangeType(null, typeof(int?))
出于某些不明原因,Nullables被认为是价值类型.例如,typeof(int?).IsValueType退货true.
对我来说,自从Nullable<T>接受以来null,它是类类型,而不是值类型.有谁知道为什么它会以不同的方式实施?
Meh*_*ari 30
System.Nullable<T>在技术上是一个结构,所以它是一个值类型(null的价值Nullable<T>是不完全一样的东西作为一个空引用,它是一个表示没有值的布尔标志).然而,它的运行时经过特殊处理,这使得这是一种尴尬的价值类型.首先,它不满足where T : struct类型约束(它也不满足where T : class它的价值).其次,它表现出一种有趣的拳击行为.拳击a Nullable<T>将导致:
null参考,如果该值是null.如果实际包含值,则为基础类型的盒装值.也就是说,在声明中:
int? x = 2;
object y = x;
Run Code Online (Sandbox Code Playgroud)
y不是盒装的Nullable<int>.它只是一个盒装int.您可以拆箱类型的任何装箱值T至Nullable<T>(和T,当然).在值中投射null对Nullable<T>结果的引用null(如您所料).
运行时的这种特殊处理使可空类型的工作方式null与引用类型的工作方式更相似.