初期化子で読み取り専用変数を初期化できないのはなぜですか? 質問する

初期化子で読み取り専用変数を初期化できないのはなぜですか? 質問する

初期化子で読み取り専用変数を初期化できないのはなぜですか? 次のコードは期待どおりに動作しません。

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プロパティを設定することはできません。

おすすめ記事