初期化子で読み取り専用変数を初期化できないのはなぜですか? 次のコードは期待どおりに動作しません。
class Foo
{
public readonly int bar;
}
new Foo { bar=0; }; // does not work
これは CLR の技術的な制限によるものでしょうか?
編集
new Foo { bar=0; }
と同じであることはわかっていますnew Foo().bar=0;
が、「読み取り専用」は CLR によって強制されるのでしょうか、それとも単にコンパイラの制限なのでしょうか?
ベストアンサー1
初期化子は単なる構文糖です。次のように記述すると、
new Foo { bar=0; };
(ちなみに、これは構文エラーなので、次のようにすべきです...)
new Foo { bar=0 }
実際に起こっていることは次のとおりです。
var x = new Foo();
x.bar = 0;
プロパティは読み取り専用なので、2 番目のステートメントは無効です。
編集:あなたの編集に基づくと、質問は少し不明確です。readonly
プロパティは、設計上、設定できません。オブジェクトの構築時に構築されます。これは、コンパイラとランタイムの両方によって強制されます。(確かに、後者についてはテストしていません。前者を回避するには、何らかのトリックが必要になるからです。)
「コンパイル」には 2 つの段階があることに留意してください。これは、C# コードを IL コードにコンパイルするときに強制され、IL コードをマシン コードにコンパイルするときにも強制されます。
これはCLRの技術的な制限ではなく、機能している。その通り明示的な宣言があれば、当然のことですが、readonly
オブジェクトが構築された後は、readonly
プロパティを設定することはできません。