Кир*_*рин 29 .net c# nullable nullreferenceexception
请考虑以下代码:
int? x = null;
Console.Write ("Hashcode: ");
Console.WriteLine(x.GetHashCode());
Console.Write("Type: ");
Console.WriteLine(x.GetType());
Run Code Online (Sandbox Code Playgroud)
执行时,它会写入Hashcode 0,但NullReferenceException在尝试确定类型时失败x.我知道调用可空类型的方法实际上是在底层值上调用的,所以我希望程序在期间失败x.GetHashCode().
那么,这两种方法之间的根本区别是什么,为什么第一种方法失败呢?
Che*_*hen 34
这是因为int? x = null;基本上创建了一个值类型的实例System.Nullable<int>,带有"内部" null值(您可以通过.HasVaueProperty 检查它).当GetHashCode调用时,覆盖Nullable<int>.GetHashCode是候选方法(因为该方法是虚拟的),现在我们有一个实例Nullable<int>,并执行其实例方法,完美.
调用时GetType,该方法是非虚拟的,所以的实例Nullable<int>是盒装到System.Object第一,根据该文件,和盒装值null,因此NullReferenceException.
Eri*_*ert 16
澄清Danny Chen的正确答案:
Nullable<T>是一种值类型.值类型包含bool,表示nullity(false表示null),T表示值.Nullable<T>.它们可以装入盒装T或空引用.S实现的方法被实现为好像它具有不可见的ref S参数; 那就是如何this通过.C实现的方法被实现为好像存在不可见的C参数; 那就是如何this通过.现在你有足够的信息来推断会发生什么.GetHashCode是虚拟的并被覆盖,Nullable<T>所以当你调用它时,你称之为有一个不可见的ref Nullable<T>参数this.没有拳击发生.
GetType不是虚拟的,因此无法覆盖并定义object.因此它期望一个objectfor this,当Nullable<T>在接收器上调用时必须装箱,因此可以将box设置为null,因此可以抛出.
如果你打电话,((object)x).GetHashCode()那么你会看到一个例外.
执行情况Nullable<T>.GetHashCode()如下:
public override int GetHashCode()
{
if (!this.HasValue)
{
return 0;
}
return this.value.GetHashCode();
}
Run Code Online (Sandbox Code Playgroud)
因此,当值为null时,它将始终为您提供0.
x.GetType()与null.GetType()抛出相同Object reference not set to an instance of an object
| 归档时间: |
|
| 查看次数: |
2370 次 |
| 最近记录: |