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

C#旧代码构造函数链报错修复咨询:this调用构造函数失效

修复C#构造函数链调用错误的正确方式

问题本质

你遇到的错误并非“旧版C#允许现在不允许”——C#任何版本都不允许在构造函数体内部使用this(i)调用其他构造函数。构造函数的链式调用必须放在构造函数声明的初始化器位置(即: this(...)),不能在执行代码逻辑后再调用。

解决方案

根据计算i的代码复杂度,有两种修复方式:

1. 简单计算逻辑:抽成静态方法内联到初始化器

如果原来计算i的代码不依赖实例成员,把这段逻辑抽成静态方法,然后在无参构造的初始化器里调用:

class Foo
{
    public Foo() : this(CalculateInitialValue())
    {
        // 这里可以添加无参构造特有的逻辑(如果需要)
    }

    public Foo(int i)
    {
        // 带参构造的核心逻辑
    }

    // 封装原来计算i的代码为静态方法
    private static int CalculateInitialValue()
    {
        // 替换为原来/*block of code*/的内容
        int temp = 10;
        temp += 5;
        return temp;
    }
}

原因:构造函数初始化器阶段还未完成实例化,只能调用静态成员,静态方法刚好满足这个要求。

2. 复杂/依赖实例的计算逻辑:抽公共初始化方法

如果计算i的代码需要依赖实例成员(比如访问实例字段),则放弃链式调用,把两个构造函数的公共逻辑抽成私有初始化方法:

class Foo
{
    private int someField;

    public Foo()
    {
        int i = /*block of code*/; // 这里可以正常计算i
        Initialize(i);
    }

    public Foo(int i)
    {
        Initialize(i);
    }

    // 公共初始化逻辑
    private void Initialize(int i)
    {
        // 原来带参构造里的逻辑移到这里,比如:
        someField = i * 2;
    }
}

这种方式保证了代码复用,同时允许在无参构造里先执行计算逻辑再初始化。

补充说明

你之前尝试的public Foo(): this(i)无法生效,是因为初始化器里的变量i还未被定义——初始化器的执行时机早于构造函数体内部的变量声明,自然无法识别。

内容的提问来源于stack exchange,提问作者Graf123456

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 23:45:43