【发布时间】:2018-10-12 04:42:40
【问题描述】:
考虑以下代码:
int? x = null;
Console.Write ("Hashcode: ");
Console.WriteLine(x.GetHashCode());
Console.Write("Type: ");
Console.WriteLine(x.GetType());
在执行时,它写入哈希码是0,但在尝试确定x 的类型时以NullReferenceException 失败。
我知道在可空类型上调用的方法实际上是在底层值上调用的,所以我预计程序在 x.GetHashCode() 期间会失败。
那么,这两种方法的根本区别是什么?为什么第一种方法没有失败?
【问题讨论】:
-
我能找到的唯一区别是
GetHashCode是virtual... -
ILSpy 是一个方便的小工具,可以帮助回答这类问题。
-
我觉得奇怪的是
GetType()从Nullable<int>返回System.Int32,而不是System.Nullable<System.Int32>。 -
另外值得注意的是
int? x = null是Nullable<int> x = new Nullable<int>(null)的语法糖。所以,x是一个实际的对象,而不是一个空引用。 -
参考源 - github.com/Microsoft/referencesource/blob/master/mscorlib/… - 没有显示 GetType 正在被处理,文档也没有详细说明 - docs.microsoft.com/en-us/dotnet/api/…
标签: c# .net nullreferenceexception nullable