繁体   English   中英

为什么在原始类型实例上调用Object类的某些函数需要装箱?

[英]Why calling some functions of the Object class, on a primitive type instance, need boxing?

我发现如果我运行以下代码行。

int i = 7;
i.GetHashCode(); //where GetHashCode() is the derived
                 //function from System.Object

没有装箱,但是如果我调用i.GetType() (来自System.Object另一个派生函数)代替GetHashCode() ,则需要装箱来调用GetType() ,为什么不能调用GetType()在原始类型实例上直接,没有拳击,而它可以调用GetHashCode()而不用拳击?

这里的关键是GetType()不是虚拟的,不能被覆盖。 由于结构是有效的sealed ,方法不能被重写比任何结构 ,所以运行时和编译器可以处理已经覆盖静态调用结构的方法。

如果你编写一个结构(罕见),你应该覆盖所有方法,如ToString()Equals()GetHashCode() ,正是出于这个原因。 如果你不这样做必须装箱。 但是, GetType() 无法被覆盖,因此需要装箱。

这实际上导致一些奇怪的边缘情况与Nullable<T>和装箱,因为空的Nullable<T>框为null ,所以:

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

我认为原因是GetHashCode直接在System.Int32上实现,你调用System.Int32 :: GetHashCode()。 如果在值类型上调用已知成员函数,则无需使用框。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM