我刚刚从同事那里得到这个让我疯狂的测验.对于这段代码:
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!"的使用表明所述测验的作者可能是我.如果是这样的话,就会让你发疯的道歉.)
| 归档时间: |
|
| 查看次数: |
1480 次 |
| 最近记录: |