You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询: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ô

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 17:55:18