求助:C#构造函数继承层级中出现CS7036错误的原因
解决C#构造函数继承中的CS7036错误
错误核心原因
你的Character类仅定义了一个带4个参数的构造函数:
public Character(string name, int hp, int atk, int def)
在C#中,若基类没有无参构造函数,子类的所有构造函数必须显式调用基类的某个构造函数。而你的Player类最后一个构造函数未通过: base(...)指定基类构造函数调用,编译器会尝试自动调用基类的无参构造函数——但基类不存在该构造函数,因此抛出CS7036错误。
另外,Player前几个构造函数使用了string? name(可空字符串),但Character构造函数的name参数是string(非可空),直接传递会引发潜在的空引用问题,这也是需要修正的细节。
修复方案
方案1:统一参数可空性+显式调用基类构造函数
- 修改
Character构造函数,将name参数改为可空类型(若允许角色名称为null):
public Character(string? name, int hp, int atk, int def) { Name = name; HP = hp; ATK = atk; DEF = def; }
- 修改
Player的最终构造函数,添加: base(...)调用基类构造函数,同时可去掉重复的基类属性赋值(更符合编码规范):
public Player(Room room, string? name, int hp, int atk, int def) : base(name, hp, atk, def) { _currentRoom = room; LVL = 1; XP = 0; MXP = 13; COIN = 13; }
方案2:保持基类非可空,处理null输入
若不允许Character的name为null,可在Player构造函数中为null的name提供默认值(比如空字符串):
public Player(Room room, string? name, int hp, int atk, int def) : base(name ?? "", hp, atk, def) { _currentRoom = room; LVL = 1; XP = 0; MXP = 13; COIN = 13; }
补充:保持构造函数链式调用一致性
Player前几个构造函数的链式调用逻辑无需修改,因为它们最终会指向修改后的最终构造函数,自动完成基类构造函数的调用。
之前尝试未解决的原因
- 调整继承层级:问题根源是构造函数调用逻辑,与继承层级无关
- 设置name为可空:仅修改子类参数但未同步基类参数,或未处理向基类传递null的问题
- 修改构造函数:未添加
base关键字显式调用基类构造函数,编译器仍无法找到合适的基类构造函数
内容的提问来源于stack exchange,提问作者IceSigil
相关产品推荐
相关产品推荐

