c# – 为什么调用Object类的一些函数在一个原始类型的实例上需要
发布时间:2020-12-15 03:42:48 所属栏目:百科 来源:网络整理
导读:我发现如果我运行以下代码行. int i = 7;i.GetHashCode(); //where GetHashCode() is the derived //function from System.Object 没有拳击完成,但是如果我调用i.GetType()(来自System.Object的另一个派生函数)代替GetHashCode(),则需要一个拳击来调用GetTyp
我发现如果我运行以下代码行.
int i = 7; i.GetHashCode(); //where GetHashCode() is the derived //function from System.Object 没有拳击完成,但是如果我调用i.GetType()(来自System.Object的另一个派生函数)代替GetHashCode(),则需要一个拳击来调用GetType(),为什么不可能调用GetType()对原始类型的实例直接,没有拳击,而它可能调用GetHashCode()没有拳击? 解决方法
这里的关键是GetType()不是虚拟的,不能被覆盖.由于struct被有效地封装,所以方法不能比struct重写,因此运行时和编译器可以将已被重写为静态调用的struct方法.
如果你编写一个结构(很少),你应该覆盖所有的方法,如ToString(),Equals(),GetHashCode()这个原因.如果你不这样就必须盒子.但是,GetType()不能被覆盖,因此需要装箱. 这实际上导致了一些奇怪的边缘情况与Nullable
int i = obj.GetHashCode(); // fine Type t = obj.GetType(); // boom (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |