来自这个问题 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/

10-12 05:57