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

构造函数无法调用自身:带基类参数的私有构造函数调用问题

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:25:21