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

c# – Nullable <>为什么不隐藏GetType?,第1张

概述来自这个问题 why does n.GetHashCode() work but n.GetType() throws and exception? Jon给出的答案引导我提出这个问题:为什么不是Nullable<>隐藏GetType: public new Type GetType(){ return GetValueOrDefault().GetType();} 因为那么 int? 来自这个问题 why does n.GetHashCode() work but n.GetType() throws and exception? Jon给出的答案引导我提出这个问题:为什么不是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不是虚拟的并且无法被覆盖.因此,当调用它时,我被装入对象,导致null然后它抛出.但是如果Nullable会像这样实现的话

public struct Nullable<T> where T : struct {     ....     public new Type GetType()     {         return GetValueOrDefault().GetType();     } }

然后它会使行为更加一致(imho),所有这些都可以工作,而不仅仅是前两个调用:

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的契约.

总结

以上是内存溢出为你收集整理的c# – Nullable <>为什么不隐藏GetType?全部内容,希望文章能够帮你解决c# – Nullable <>为什么不隐藏GetType?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1233454.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存