Nullable类型GetType()抛出异常

kab*_*ros 10 .net c#

我刚刚从同事那里得到这个让我疯狂的测验.对于这段代码:

var x = new Int32?();
string text = x.ToString(); // No exception
Console.WriteLine(text);
Type type = x.GetType(); // Bang!
Run Code Online (Sandbox Code Playgroud)

为什么第一部分.ToString()在不抛出异常的情况下工作,然后调用GetType()会抛出NullReferenceException?

Jon*_*eet 19

ToString被覆盖Nullable<T>,所以没有拳击参与拨打电话.

GetType() 不是一个虚方法,所以不是(也不能)重写,所以在调用之前将值装箱...并且装入可空值类型的空值会给出一个空引用.

拳击的原因在C#4规范的第7.5.5节中:

如果M是在reference-type中声明的实例函数成员:

  • ...
  • 如果类型E是值类型,则执行装箱转换(4.3.1)以转换E为类型object,并且在以下步骤中E被认为是类型object.在这种情况下,M只能是一个成员System.Object

请注意,如果你有:

var x = new Int32?(10);
Run Code Online (Sandbox Code Playgroud)

你最终得到的类型是相同的typeof(int),再次由于拳击.没有创建一个值的方式foo,使得foo.GetType()返回一个空值类型,使用正常的GetType()方法.(当然,您可以创建一种新 GetType()方法,但这是一个副作用:)

("Bang!"的使用表明所述测验的作者可能是我.如果是这样的话,就会让你发疯的道歉.)