没有办法绕过它,C# 规范明确指出“对象或集合初始化程序无法引用正在初始化的对象实例。”
至于为什么不可能,我怀疑没有很好的方法来实现它。我们想要一些相当于的语法糖
var temp = new TestClass();
temp.Id = 1;
temp.SomeProperty = SomeMethod(temp);
x = temp;
我们只需要temp
在初始化器中引用一个关键字,但没有一个是容易获得的。我们不能使用this
,因为它已经意味着初始化程序之外的东西。应该SomeProperty = this.SomeMethod(this)
等于temp.SomeProperty = this.SomeMethod(temp)
or temp.SomeProperty = temp.SomeMethod(temp)
?第二个是一致的,但是如果我们需要第一个会发生什么?
我们可以尝试使用x
,但如果新对象立即分配给变量,我们只能选择一个名称。但是,我们现在不能引用x
初始化器内部的旧值,相当于temp.SomeProperty = SomeMethod(x)
.
我们可以重用value
属性设置器中的关键字。这听起来不错,因为value
如果您认为属性 getter 是set_SomeProperty(value)
方法的语法糖,它已经代表了缺少的参数。使用它来引用对象初始化器中缺失的变量看起来很有希望。但是,我们可以在属性设置器中创建这个对象,在这种情况下,value
它已经被使用了,我们需要能够做到temp.SomeProperty = SomeMethod(value)
。
看起来我们必须为此目的创建一个新关键字,也许newthis
. 但是,这是对语言的重大更改,因为任何具有变量调用的代码newthis
都不再工作。Microsoft 通常需要一个非常好的理由来引入重大更改,因此最好禁止访问正在初始化的对象。