大家好。里希特的书中写道:
当装箱一个 Nullable<T> 实例时,会检查它是否为 null,如果是,则返回 null 而不是装箱。否则,CLR 将把实例值装箱。下面的代码演示了这种行为:
// После упаковки Nullable<T> возвращается null или упакованный тип T
Int32? n = null;
Object o = n; // o равно null
是的,当然,o == null,但我认为不应该有任何包装,但是有:
IL_0008: ldloc.0 // n
IL_0009: box valuetype [System.Runtime]System.Nullable`1<int32>
IL_000e: stloc.1 // o
IL_000f: ret
有人能解释为什么会发生这种情况吗?或者说这些信息已经过时了?
该行为取决于运行时变量的值:
IL表明它已被使用
box для Nullable<int>,这可能会产生误导——就好像正在发生包装一样。因此 IL 代码总是包含框,但实际行为取决于值并在运行时决定。
C#规范中也对此进行了描述,并且确实与 Richter 所说的相符。
IL 具有指令这一事实并不与 CLR 中的装箱行为特殊的
box Nullable<T>说法相矛盾:如果结果为,否则它就是具有类型值的箱子。此行为是在 JIT 编译级别实现的,而不是直接反映在 IL 中。Nullable<T>HasValue = falsenullT