C#6 では、セッターなしでプロパティを初期化する機能が導入されたため、この種の構文を使用できるようになりました
public class MyClass
{
public int Answer { get; } = 42;
}
またはこれさえ
public class MyClass
{
public int Answer { get; }
public MyClass()
{
Answer = 42;
}
}
readonly
これがCILのアクセサメソッドを使用して生成されたフィールドに変換されることを知っている(というか、強く想定している)ので、これがどのように行われるかを理解しています
public class MyClass
{
public int Answer { get; }
public MyClass CreateMyClassInstance()
{
return new MyClass()
{
Answer = 42
};
}
}
コンパイルされません (代入は技術的にコンストラクターの外部で発生し、バッキングreadonly
フィールドによって課される制限と競合するため)。
私の質問は、そもそもなぜそのような行為が禁止されているのですか? 構文および/またはコンパイルの観点から、オブジェクト初期化子の一部であるプロパティの割り当てが、後で実行する追加のインライン ロジックと見なされるだけでなく、オブジェクトのコンストラクター内にあるのはなぜですか? それは設計によるものなのか、技術的な制限や下位互換性の結果なのか、それとも考慮に値するほど重要ではない単なる変更なのか?