为什么Nullable <T>被认为是值类型?

jpb*_*chi 14 .net nullable

您是否尝试过使用该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.您可以拆箱类型的任何装箱值TNullable<T>(和T,当然).在值中投射nullNullable<T>结果的引用null(如您所料).

运行时的这种特殊处理使可空类型的工作方式null与引用类型的工作方式更相似.

  • 奇怪的拳击行为需要一段时间来理解 - 但我很高兴这是它的方式; 否则`Nullable <T>`(来自值传递透明度)的大部分值都将丢失. (3认同)

R. *_*des 12

Nullable<T>是一个值类型(它是一个结构,请参阅MSDN文档中),但是有一个隐式转换nullNullable<T>没有值的值(x.HasValue == false).还有从类型T值到类型值的隐式转换Nullable<T>.

此外,所有操作符都从常规类型中解除,直接使用可空类型.