开门见山:
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()
可以工作,并且它对对象内部的值起作用。