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

C#如何通过基类引用强制转换访问派生类独有字段

C# 基类引用访问派生类专属字段的正确实现

原代码的核心问题

  • 你声明的数组类型是Student[],所有数组元素的编译时类型固定为基类Student。即使你把元素强转为SpecificStudent再赋值回数组位置,编译器仍会将其识别为Student类型,无法感知派生类独有的grade字段。
  • 数组初始化后所有元素默认值为null,你没有为元素创建实际的对象实例,直接给name字段赋值本身就会触发空引用异常;且没有创建SpecificStudent实例的前提下,强制转换没有任何实际意义,若把普通基类实例直接强转为派生类还会抛出InvalidCastException。

实现规则

通过基类引用访问派生类专属成员必须满足两个前提:

  1. 基类引用实际指向的内存对象就是目标派生类的实例
  2. 强制转换的结果必须用派生类类型的单独变量接收,不能存回基类类型的变量、数组等存储位置,否则编译时类型仍为基类,无法访问派生类成员。

修正后的可运行代码

namespace ConsoleApp4
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Student[] students = new Student[2];
            
            // 初始化普通基类实例
            students[0] = new Student();
            students[0].name = "somename";

            // 初始化派生类实例,存入基类数组
            students[1] = new SpecificStudent();
            students[1].name = "anothersomename";

            // 写法1:直接强制转换 明确知道实例是SpecificStudent时使用,转换失败会抛异常
            SpecificStudent convertedStu = (SpecificStudent)students[1];
            convertedStu.grade = "高三年级"; // 正常访问专属字段
            Console.WriteLine(convertedStu.grade);

            // 写法2:模式匹配安全转换(推荐) 不确定实例类型时使用,转换失败不会抛异常
            if (students[1] is SpecificStudent safeStu)
            {
                safeStu.grade = "高二年级";
                Console.WriteLine(safeStu.grade);
            }
        }
        class Student
        {
            public string name;
        }
        class SpecificStudent:Student
        {
            public string grade;
        }
    }
}

内容的提问来源于stack exchange,提问作者user16330531

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 01:54:33