从这个问题为什么n.GetHashCode()可以工作,但n.GetType()会抛出异常? Jon给出的答案引导我提出了这个问题:为什么Nullable<>
没有隐藏GetType
:
public new Type GetType()
{
return GetValueOrDefault().GetType();
}
因为这样
,然后
int? i = null;
Console.WriteLine(i.GetType().Name);
应该可以正常工作,对吧?我是不是漏掉了什么明显的东西?有哪些注意事项?我已经尝试在Google上搜索,但没有找到令人满意的解释。
更新:为了澄清一点。这个可以正常工作:
int? i = null;
Console.WriteLine(i.GetHashCode());
唯一的原因是
i.GetType()
抛出异常是因为 GetType
不是虚拟的,无法覆盖。所以当调用它时,i
被装箱成对象,导致结果为 null
,然后抛出异常。但是如果实现了 Nullable
,就像这样: public struct Nullable<T> where T : struct
{
....
public new Type GetType()
{
return GetValueOrDefault().GetType();
}
}
那么这将使行为更加一致(个人认为),因为所有这些调用都可以工作,而不仅仅是前两个调用:
int? i = null;
Console.WriteLine(i.GetHashCode());
Console.WriteLine(i.ToString());
Console.WriteLine(i.GetType());
Object
的方法? - Kevinint?
是Nullable<int>
的语法糖,它是一个值类型。你可以将null
赋值给它的唯一原因是因为 CLR 中实现了特殊的行为。所以i.GetType()
在技术上 不等于null.GetType()
。由于上述原因和我在问题中提到的原因,最终结果是这样的,尽管我认为这可以避免,但事实并非如此。因此,我的问题。 - ChrisWue