构造函数无法调用自身:带基类参数的私有构造函数调用问题
解决C#构造函数自调用错误(参数类型匹配问题)
你的代码编译报错是因为:两个公共构造函数里的this(improvement, costResolutionContext, costProvider)被编译器解析为调用自身构造函数——传入的improvement参数类型(StarSystemImprovement/PlanetImprovement)和当前构造函数的第一个参数类型完全一致,编译器会优先匹配最精确的重载,而非那个参数为父类Improvement的私有构造,因此触发“构造函数不能调用自身”的错误。
以下两种方案可以解决问题:
方案一:显式转换参数类型
将子类类型的improvement强制转换为父类Improvement,引导编译器匹配到私有构造函数:
public class ImprovementWithProductionCost : IComparable { public ImprovementWithProductionCost(StarSystemImprovement improvement, ICostResolutionContext costResolutionContext, ICostProvider costProvider) : this((Improvement)improvement, costResolutionContext, costProvider) { this.ImprovementDefinitionName = improvement.StarSystemImprovementDefinition.Name; } public ImprovementWithProductionCost(PlanetImprovement improvement, ICostResolutionContext costResolutionContext, ICostProvider costProvider) : this((Improvement)improvement, costResolutionContext, costProvider) { this.ImprovementDefinitionName = improvement.PlanetImprovementDefinition.Name; } private ImprovementWithProductionCost(Improvement improvement, ICostResolutionContext costResolutionContext, ICostProvider costProvider) { this.Improvement = improvement; for (int i = 0; i < costProvider.Costs.Length; i++) { // 原有初始化逻辑 } } // 类成员声明 public string ImprovementDefinitionName { get; private set; } public Improvement Improvement { get; private set; } }
方案二:提取初始化逻辑到私有方法
把私有构造中的初始化逻辑抽成独立方法,直接在公共构造里调用,避免构造链匹配问题:
public class ImprovementWithProductionCost : IComparable { public ImprovementWithProductionCost(StarSystemImprovement improvement, ICostResolutionContext costResolutionContext, ICostProvider costProvider) { Initialize(improvement, costResolutionContext, costProvider); this.ImprovementDefinitionName = improvement.StarSystemImprovementDefinition.Name; } public ImprovementWithProductionCost(PlanetImprovement improvement, ICostResolutionContext costResolutionContext, ICostProvider costProvider) { Initialize(improvement, costResolutionContext, costProvider); this.ImprovementDefinitionName = improvement.PlanetImprovementDefinition.Name; } private void Initialize(Improvement improvement, ICostResolutionContext costResolutionContext, ICostProvider costProvider) { this.Improvement = improvement; for (int i = 0; i < costProvider.Costs.Length; i++) { // 原有初始化逻辑 } } // 类成员声明 public string ImprovementDefinitionName { get; private set; } public Improvement Improvement { get; private set; } }
内容的提问来源于stack exchange,提问作者Irbis77
相关产品推荐
相关产品推荐

