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
相关产品推荐
相关产品推荐

