c# – 为什么调用Object类的一些函数在一个原始类型的实例上需要装箱?

我发现如果我运行以下代码行.
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 一个空的nullable< t=""> 框为null,所以: 一个空的nullable<>

int i = obj.GetHashCode(); // fine
Type t = obj.GetType(); // boom

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...