我们已经发现,如果我运行下面的行代码。

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()方法。无需框如果调用上的值类型的已知成员函数。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top