为什么有些方法可以工作而有些方法不能处理可为空的结构的空值?

时间:2012-10-14 20:53:34

标签: c# .net struct nullable

直截了当:

int? i = null;
i.ToString(); //happy
i.GetType(); //not happy

我得到一个very related question,它实际上处理i.ToString()为什么正常工作。

修改:刚刚发现这个角落的案例已经the most voted one in this SO thread!

3 个答案:

答案 0 :(得分:7)

这是因为ToString是虚拟的,而GetType则不是。 Nullables在CLR中有特殊的拳击行为。当您在可空的网站上调用GetType时,它会被装箱(请参阅MSDN,实际上这适用于任何struct)。但是,如果可以为空,则将基础值加框,而不是实际可为空。另一方面,ToString调用Nullable<T>上的ToString方法的覆盖。另外,我要注意int? i = nullNullable<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()可以正常工作,并且它可以处理对象内的