来自这个问题 why does n.GetHashCode() work but n.GetType() throws and exception? 乔恩给出的答案让我想到了这个问题:为什么 Nullable<>
不隐藏 GetType
:
public new Type GetType()
{
return GetValueOrDefault().GetType();
}
因为那时这
int? i = null;
Console.WriteLine(i.GetType().Name);
应该工作,不是吗?我错过了一些明显的东西吗?有哪些注意事项?我试过谷歌,但没有找到任何令人满意的解释。
更新 :澄清:有点。这有效:
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());
最佳答案
我认为这是因为 GetType
返回当前实例的确切运行时类型。在这种情况下,它没有运行时类型,因为它引用了 null
。
考虑这个例子:
MyBaseClass myBase = null;
MyDerivedClass myDerived = null;
object o = myDerived;
MyBaseClass b = myDerived;
如果
myBase.GetType()
会返回 MyBaseClass
并且 myDerived.GetType()
会返回 MyDerivedClass
,那么 o.GetType()
和 b.GetType()
应该返回什么?Nullable
不是简单地隐藏 object.GetType
并在它是 null
时返回其编译时类型的原因,可能是因为它会破坏 GetType
的契约(Contract)。关于c# - 为什么 Nullable<> 不隐藏 GetType?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5549676/