13

开门见山:

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

我得到了一个非常相关的问题,它实际上涉及为什么可以i.ToString()正常工作。

编辑:刚刚发现这个极端案例是这个 SO 线程中投票最多的案例!

4

3 回答 3

7

这是因为ToString是虚拟的,而GetType不是。Nullables 在 CLR 中具有特殊的装箱行为。当您调用GetType可空对象时,它会被装箱(请参阅MSDN,实际上这发生在 any 中struct)。但是,对于可空值,底层值被装箱,而不是实际的可空值。ToString另一方面调用对 ToString 方法的覆盖Nullable<T>。另外,我会注意到这int? i = nullNullable<int> i = new Nullable<int>(). 因此,您的变量中确实有一个对象i

于 2012-10-14T20:59:43.200 回答
3

为什么不i.ToString()失败?

使用任何 .NET 反编译器并查看Nullable<T>该类。您会看到它ToString()被如下覆盖:

public override string ToString()
{
  if (!this.HasValue)
    return "";
  else
    return this.value.ToString();
}

为什么会i.GetType()失败?

请参阅mike z 的回答

于 2012-10-14T21:02:57.403 回答
0

该类型int?不是常规类型。

当你写的时候int? i = null只有对象的值为空,而不是对象本身。

对象int?继承自object,因此该函数i.ToString()可以工作,并且它对对象内部的值起作用。

于 2012-10-14T20:59:27.180 回答