开门见山:
int? i = null;
i.ToString(); //happy
i.GetType(); //not happy
我得到了一个非常相关的问题,它实际上涉及为什么可以i.ToString()正常工作。
编辑:刚刚发现这个极端案例是这个 SO 线程中投票最多的案例!
这是因为ToString是虚拟的,而GetType不是。Nullables 在 CLR 中具有特殊的装箱行为。当您调用GetType可空对象时,它会被装箱(请参阅MSDN,实际上这发生在 any 中struct)。但是,对于可空值,底层值被装箱,而不是实际的可空值。ToString另一方面调用对 ToString 方法的覆盖Nullable<T>。另外,我会注意到这int? i = null是Nullable<int> i = new Nullable<int>(). 因此,您的变量中确实有一个对象i。
为什么不
i.ToString()失败?
使用任何 .NET 反编译器并查看Nullable<T>该类。您会看到它ToString()被如下覆盖:
public override string ToString()
{
if (!this.HasValue)
return "";
else
return this.value.ToString();
}
为什么会
i.GetType()失败?
请参阅mike z 的回答。
该类型int?不是常规类型。
当你写的时候int? i = null,只有对象的值为空,而不是对象本身。
对象int?继承自object,因此该函数i.ToString()可以工作,并且它对对象内部的值起作用。