[英]C# Why does passing of an class instance to a method which accepts object as parameter and boxing it back work
[英]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()。 如果在值类型上调用已知成员函数,则无需使用框。
似乎非常接近ValueType.GetType()如何确定结构的类型 ?
另外相关的是GetType和TypeOf混淆
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.