gpt4 book ai didi

c# - 为什么 Nullable<> 不隐藏 GetType?

转载 作者:行者123 更新时间:2023-11-30 12:35:24 25 4
gpt4 key购买 nike

来自这个问题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() 将返回 MyBaseClassmyDerived.GetType() 将返回 MyDerivedClass,那么 o.GetType()b.GetType() 应该返回什么?

Nullable 不简单地隐藏 object.GetType 并在其为 null 时返回其编译时类型的原因可能是因为它会破坏 GetType 的契约(Contract)。

关于c# - 为什么 Nullable<> 不隐藏 GetType?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5549676/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com