为什么调用Object类的一些功能,在基本类型的实例,需要拳击?
-
24-09-2019 - |
题
我们已经发现,如果我运行下面的行代码。
int i = 7;
i.GetHashCode(); //where GetHashCode() is the derived
//function from System.Object
没有拳击完成,但如果我代替i.GetType()
的调用System.Object
(另一个衍生自GetHashCode()
功能),拳击将被要求通话GetType()
,为什么其无法直接调用原语类型实例GetType()
,没有拳击,而其可以调用GetHashCode()
而不拳击?
解决方案
这里的关键是,GetType()
不是虚拟的,并且不能被重写。由于结构实际上是sealed
,方法不能被重写任何的更多的比结构,使运行时和编译器可以处理结构方法的已被重写静态调用。
如果你写一个struct(罕见),你的应替换都喜欢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运算混乱
不隶属于 StackOverflow