C#创建类构造函数时报CS7036错误的原因及解决方法
C# CS7036 构造函数错误解决
错误触发原因
CS7036 错误本质为编译器无法找到匹配参数列表的构造函数重载,你遇到的报错是由C#继承的构造函数调用规则导致:
- 子类构造函数执行前会默认隐式调用父类的无参数构造函数
- 你的父类
CarCommandExecutorBase仅显式定义了接收ICarCommand类型参数的构造函数,此时编译器不会为父类自动生成默认无参构造 - 子类
CarStringCommandExecutor的构造函数没有显式指定调用的父类构造重载,编译器尝试调用父类无参构造失败,触发CS7036错误。
修复方案
优先选择显式调用父类带参构造的方案,匹配你现有代码的设计逻辑:
方案1:Car类已实现ICarCommand接口(最常见场景)
直接将子类构造的Car入参传递给父类构造即可:
public class CarStringCommandExecutor : CarCommandExecutorBase, IStringCommand { // 加base(car)显式调用父类带参构造 public CarStringCommandExecutor(Car car) : base(car) { // 你的构造逻辑 } public void ExecuteCommand(string commandObject) { } }
方案2:Car类未实现ICarCommand接口
先基于Car实例生成ICarCommand实现类的实例,再传给父类构造:
public CarStringCommandExecutor(Car car) : base(new CarCommandImpl(car)) { // 这里的CarCommandImpl是你自己实现了ICarCommand接口的类 }
备选方案:父类补充无参构造(不推荐)
如果你确实需要父类支持无参构造,要注意父类的readonly字段CarCommand只能在构造函数中赋值,需要自行处理初始化逻辑:
public class CarCommandExecutorBase { protected readonly ICarCommand CarCommand; public CarCommandExecutorBase(ICarCommand carCommand) { CarCommand = carCommand; } // 新增无参构造,自行完成字段初始化 public CarCommandExecutorBase() { CarCommand = // 你的默认ICarCommand实现,不要留空 } }
内容的提问来源于stack exchange,提问作者Oguz
相关产品推荐
相关产品推荐

