为什么这个片段的输出是System.Int32
代替Nullable<Int32>
?
int? x = 5;
Console.WriteLine(x.GetType());
GetType()
是一种方法object
.
调用它时,Nullable<T>
结构必须装箱。
您可以在 IL 代码中看到这一点:
//int? x = 5;
IL_0000: ldloca.s 00
IL_0002: ldc.i4.5
IL_0003: call System.Nullable<System.Int32>..ctor
//Console.WriteLine(x.GetType());
IL_0008: ldloc.0
IL_0009: box System.Nullable<System.Int32>
IL_000E: callvirt System.Object.GetType
IL_0013: call System.Console.WriteLine
可空类型由 CLR 特殊处理;不可能有可为 null 类型的装箱实例。
相反,装箱可为 null 的类型将导致 null 引用(如果HasValue
为 false),或装箱值(如果有值)。
因此,box System.Nullable<System.Int32>
指令结果在盒装中Int32
,不是盒装的Nullable<Int32>
.
因此,不可能GetType()
to ever return Nullable<T>
.
为了更清楚地看到这一点,请查看以下代码:
static void Main()
{
int? x = 5;
PrintType(x);
}
static void PrintType<T>(T val) {
Console.WriteLine("Compile-time type: " + typeof(T));
Console.WriteLine("Run-time type: " + val.GetType());
}
这打印
编译时类型:System.Nullable`1[System.Int32]
运行时类型:System.Int32
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)