これを回避する方法はありません。C# の仕様では、 「オブジェクトまたはコレクション初期化子が初期化中のオブジェクト インスタンスを参照することはできません」と明示的に述べられています。
なぜそれが不可能なのかというと、それを実装する良い方法がないだけだと思います。と同等の構文糖衣が必要です
var temp = new TestClass();
temp.Id = 1;
temp.SomeProperty = SomeMethod(temp);
x = temp;
tempイニシャライザ内で参照するキーワードが必要なだけですが、簡単に利用できるものはありません。thisすでにイニシャライザの外にあるものを意味しているため、使用できません。または?SomeProperty = this.SomeMethod(this)と同等である必要があります。2 番目は一貫性がありますが、1 番目が必要な場合はどうなるでしょうか。temp.SomeProperty = this.SomeMethod(temp)temp.SomeProperty = temp.SomeMethod(temp)
を使用することxもできますが、新しいオブジェクトがすぐに変数に割り当てられる場合にのみ名前を選択できます。xただし、イニシャライザ内での古い値を参照することはできなくなり、 と同等の処理が行われtemp.SomeProperty = SomeMethod(x)ます。
valueプロパティ セッターのキーワードを再利用できます。valueプロパティ ゲッターがメソッドのシンタックス シュガーであると考える場合、欠落しているパラメーターの代役をすでに果たしているため、これは良さそうですset_SomeProperty(value)。それを使用して、オブジェクト初期化子で欠落している変数も参照することは有望に見えます。ただし、プロパティ セッター内でこのオブジェクトを作成することもできます。その場合、valueは既に使用されており、できるようにする必要がありますtemp.SomeProperty = SomeMethod(value)。
この目的のためだけに、新しいキーワードを作成する必要があるようnewthisです。newthisただし、変数が呼び出されたコードは機能しなくなるため、これは言語に対する重大な変更です。Microsoft は通常、互換性を破る変更を導入する正当な理由を必要とするため、初期化中のオブジェクトへのアクセスを禁止することをお勧めします。