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
相关产品推荐
相关产品推荐

