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

C#类继承场景下属性初始化及构造函数报错问题

问题原因

你遇到的报错是C#继承机制的既定规则导致的:

  • 当你没有为类显式编写任何构造函数时,编译器会自动生成一个无参构造函数;一旦你显式写了带参数的构造函数,编译器就不会再自动生成无参构造。
  • 派生类实例化时,默认会先调用基类的无参构造函数。你的Banking、Savings类都没有显式定义构造函数,也没有指定要调用基类的带参构造,编译器找不到基类的无参构造就会抛出错误。
  • 直接移除基类带参构造函数的处理方式是错误的。
关于属性初始化的建议

如果Amount是账户类必须具备的核心属性(即创建账户实例时必须指定初始金额,不允许出现金额未赋值的无效账户),你必须通过基类构造函数强制要求初始化该属性,这是保证对象状态合法的必要手段,不要为了消除报错直接移除构造函数。移除带参构造后,Amount会被默认赋值为0,编译期不会校验你是否在实例化时传了正确的初始金额,很容易出现漏赋值的业务bug。

正确修复方式

为派生类显式定义构造函数,通过base关键字显式调用基类的带参构造函数,把参数传递给基类初始化逻辑即可,修复后的代码如下:

class Account
{
    public long Amount { get; set; }

    public Account(long amount)
    {
        Amount = amount;
    }
}

class Banking : Account
{
    // 派生类构造函数,接收amount参数,传递给基类完成初始化
    public Banking(long amount) : base(amount)
    {
        // 此处可编写Banking类独有的初始化逻辑
    }
}

class Savings : Account
{
    public Savings(long amount) : base(amount)
    {
        // 此处可编写Savings类独有的初始化逻辑
    }
}

如果你的业务场景确实允许创建账户时暂时不指定金额,可以额外为基类显式添加一个无参构造函数,但这种方式不推荐——你需要自行保证后续所有逻辑里都正确给Amount赋值,编译期没法做校验,漏赋值的风险很高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 10:30:45