C#如何通过基类引用强制转换访问派生类独有字段
C# 基类引用访问派生类专属字段的正确实现
原代码的核心问题
- 你声明的数组类型是
Student[],所有数组元素的编译时类型固定为基类Student。即使你把元素强转为SpecificStudent再赋值回数组位置,编译器仍会将其识别为Student类型,无法感知派生类独有的grade字段。 - 数组初始化后所有元素默认值为
null,你没有为元素创建实际的对象实例,直接给name字段赋值本身就会触发空引用异常;且没有创建SpecificStudent实例的前提下,强制转换没有任何实际意义,若把普通基类实例直接强转为派生类还会抛出InvalidCastException。
实现规则
通过基类引用访问派生类专属成员必须满足两个前提:
- 基类引用实际指向的内存对象就是目标派生类的实例
- 强制转换的结果必须用派生类类型的单独变量接收,不能存回基类类型的变量、数组等存储位置,否则编译时类型仍为基类,无法访问派生类成员。
修正后的可运行代码
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
相关产品推荐
相关产品推荐

