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

C#将子类存入抽象类类型List后读取字段显示0或null如何解决

问题原因与解决方法

你将子类实例存入父类类型集合的操作本身是符合C#多态特性的,输出字段为0或null的核心原因几乎都出在抽象父类Car与子类的构造逻辑、字段定义不匹配上,以下是三种最常见的场景和对应修复方案:


1. 子类构造函数未向父类传递参数

这是新手最容易踩的坑:你在Passenger、Industrial的构造函数里接收了Id等参数,但没有调用父类Car的构造函数把值传进去,导致父类定义的Id等字段始终保持默认值(值类型为0,字符串等引用类型为null)。

错误写法示例:

public abstract class Car
{
    public int Id;
    public string Name;
    // 其他公共字段...
    // 父类定义了带参构造
    public Car(int id, string name, string brand, double price, condition cond, int year, type type)
    {
        Id = id;
        Name = name;
        // 其他公共字段赋值...
    }
}

public class Passenger : Car
{
    public int SeatCount;
    // 错误:子类构造没有调用base()传递父类需要的参数
    public Passenger(int id, string name, string brand, double price, condition cond, int year, type type, int seatCount)
    {
        // 仅给子类自有字段赋值,父类的Id、Name完全未被赋值
        SeatCount = seatCount;
    }
}

修复方法:

子类构造函数末尾加: base(参数列表),把父类需要的参数传递进去即可:

public class Passenger : Car
{
    public int SeatCount;
    public Passenger(int id, string name, string brand, double price, condition cond, int year, type type, int seatCount)
    // 把父类需要的参数按顺序传给base构造
    : base(id, name, brand, price, cond, year, type)
    {
        SeatCount = seatCount;
    }
}

Industrial子类按照同样的逻辑修改构造函数即可。

2. 子类重复定义了和父类同名的字段

如果你在子类Passenger、Industrial里又重新定义了一遍Id、Name等和父类重名的字段,那么你给子类字段赋值后,用父类Car类型的引用访问时,会优先读取父类的同名字段,自然得到默认值。

错误写法示例:

public abstract class Car
{
    public int Id;
}

public class Passenger : Car
{
    // 错误:重复定义同名字段,隐藏了父类的Id
    public int Id;
    public Passenger(int id, ...)
    {
        // 这里赋值的是子类自己的Id,父类的Id仍然是0
        this.Id = id;
    }
}

修复方法:

删除子类中重复定义的、和父类公共字段同名的字段即可,直接使用父类定义的字段存储公共属性。

3. 执行顺序错误

请确保你调用ShowItem()之前,已经先执行过AddItems()方法完成集合的初始化,如果AddItems()未执行,会出现无输出或者集合为空的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 11:54:04