直截了当:
int? i = null;
i.ToString(); //happy
i.GetType(); //not happy
我得到一个very related question,它实际上处理i.ToString()
为什么正常工作。
修改:刚刚发现这个角落的案例已经the most voted one in this SO thread!
答案 0 :(得分:7)
这是因为ToString
是虚拟的,而GetType
则不是。 Nullables在CLR中有特殊的拳击行为。当您在可空的网站上调用GetType
时,它会被装箱(请参阅MSDN,实际上这适用于任何struct
)。但是,如果可以为空,则将基础值加框,而不是实际可为空。另一方面,ToString
调用Nullable<T>
上的ToString方法的覆盖。另外,我要注意int? i = null
是Nullable<int> i = new Nullable<int>()
的语法糖。因此,变量i
中确实有一个对象。
答案 1 :(得分:3)
为什么
i.ToString()
没有失败?
使用任何.NET反编译器并查看Nullable<T>
类。您会看到ToString()
被覆盖如下:
public override string ToString()
{
if (!this.HasValue)
return "";
else
return this.value.ToString();
}
为什么
i.GetType()
会失败?
请参阅mike z's answer。
答案 2 :(得分:0)
类型int?
不是常规类型。
当您编写int? i = null
,仅时,对象的值为null,而不是对象本身。
对象int?
继承自object
,因此函数i.ToString()
可以正常工作,并且它可以处理对象内的值。