为何‘base’对象的类型是我的具体类型A而非object?
这个问题其实是对C#里base关键字的作用理解有偏差,我来给你拆解清楚:
为什么base的类型是A而不是object?
在C#中,base关键字的核心作用是引用当前类的直接基类实例,而不是直接跳到继承链最顶端的object。举个实际的代码例子,假设你的类结构是这样的:
public class A { } public class B : A { public void CheckBaseType() { // 这里的base指向当前B实例的A部分,类型是A,不是object Console.WriteLine(base.GetType()); // 输出结果是A } }
哪怕A本身继承自object,base也只会指向你的类的直接父类,不会自动跳过中间层去引用最顶层的object——这是C#继承机制的设计逻辑,base就是用来让你访问直接父类的成员,而非跨级访问。
为什么base.GetHashCode()没触发object的实现?
这要看你的类A有没有重写GetHashCode():
- 如果A没有重写
GetHashCode(),那你在子类里调用base.GetHashCode(),最终还是会调用object的默认实现,因为A继承的就是object的版本。 - 如果A已经重写了
GetHashCode(),那base.GetHashCode()就会优先调用A的重写版本,而不是object的。
如果你确实需要绕开中间基类,直接调用object的GetHashCode()实现,可以通过强制转换当前实例为object的方式:
public class B : A { public override int GetHashCode() { // 强制转成object后调用,就能触发object的GetHashCode() return ((object)this).GetHashCode(); } }
内容的提问来源于stack exchange,提问作者Phate01
相关产品推荐
相关产品推荐

