C#中能否在ClassD带参构造同时调用基类与自身无参构造?
直接给你答案:不行。C#的构造函数初始化列表规则明确禁止同时使用base(...)和this(...),这就是你注释里的this()会编译报错的原因。
为什么不行?
背后的逻辑很简单——构造函数的执行顺序是固定的:
- 如果用了
this(...),会先调用同类的其他构造函数,而那个构造函数必然会调用基类构造(要么显式写base,要么隐式调用无参基类构造); - 如果同时写
base和this,会导致基类构造被重复调用,甚至出现执行顺序混乱的问题,所以C#编译器直接堵死了这条路。
替代解决方案
你可以通过两种方式实现相同的逻辑复用效果:
1. 提取共享初始化逻辑到私有方法
把无参构造里的初始化代码抽成一个私有方法,然后在两个构造函数里分别调用它:
public class ClassA { public ClassA(string message) { } public ClassA() { } } public class ClassD : ClassA { public string Name { get; } // 封装重复的初始化逻辑 private void InitializeDefaults() { Name = nameof(ClassD); } public ClassD() { InitializeDefaults(); } public ClassD(string message) : base(message) { InitializeDefaults(); // 调用共享逻辑完成初始化 } }
2. 调整构造函数调用链(业务允许时)
如果带参构造的参数可以设置合理的默认值,你可以让无参构造调用带参构造,这样只需要在带参构造里写一次初始化逻辑:
public class ClassD : ClassA { public string Name { get; } // 无参构造调用带参构造,传入默认参数 public ClassD() : this("默认消息") { } public ClassD(string message) : base(message) { Name = nameof(ClassD); } }
这两种方式都能达到你想要的“复用无参构造逻辑+调用基类带参构造”的目的,完全符合C#的语法规则。
内容的提问来源于stack exchange,提问作者Moerwald
相关产品推荐
相关产品推荐

