咨询:C#中使用继承时为何无法访问子类字段?
问题原因解释
这是因为C#是静态类型语言,编译阶段会根据变量的编译时类型(而非实际指向的运行时类型)来检查成员的可访问性:
- 变量
a的编译时类型是Student,Student类中定义了X属性,所以编译时能直接访问a.X。 - 变量
y的编译时类型是Person,而你的Person抽象类里并没有定义X属性——哪怕它实际指向的是Gamer实例,编译阶段只会认Person的成员列表,自然找不到X,所以报错。
简单说:父类引用只能访问父类(或父类继承链上)定义的成员,子类独有的成员无法通过父类引用直接访问。
两种常见解决思路
- 把
X提升到Person类中:如果X是所有Person子类共有的属性,直接在Person里定义(可以是抽象、虚或者带默认实现的属性),这样所有子类继承后,父类引用就能访问X。abstract class Person { public abstract void Display(); public abstract int X { get; set; } // 新增抽象属性 } class Student : Person { public override int X { get; set; } = 1; // 重写 // ... 其他代码不变 } - 类型转换:如果只是临时需要访问子类成员,可以把
y强制转换为Gamer类型(注意空值或类型不匹配的情况,可结合is/as安全转换):// 安全转换方式 if (y is Gamer gamer) { Console.WriteLine(gamer.X); }
内容的提问来源于stack exchange,提问作者Nhơn Vô
相关产品推荐
相关产品推荐

