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

求助: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:统一参数可空性+显式调用基类构造函数

  1. 修改Character构造函数,将name参数改为可空类型(若允许角色名称为null):
public Character(string? name, int hp, int atk, int def)
{
    Name = name; 
    HP = hp; 
    ATK = atk; 
    DEF = def;  
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 04:44:56