例 1
private const string _DefaultIconPath = _IconsPath + "default.ico";
private const string _IconsPath = "Icons/";
実行時のこれらの文字列の値:
- _DefaultIconPath: "アイコン/default.ico"
- _IconsPath: "アイコン/"
例 2
private readonly string _DefaultIconPath = _IconsPath + "default.ico";
private readonly string _IconsPath = "Icons/";
コンパイル時エラー:
A field initializer cannot reference the non-static field, method, or property '_IconsPath'
例 3
private static readonly string _DefaultIconPath = _IconsPath + "default.ico";
private static readonly string _IconsPath = "Icons/";
実行時のこれらの文字列の値:
- _DefaultIconPath: "default.ico" (_IconsPath は に評価され
null
ます) - _IconsPath: "アイコン/"
質問
例 2 と同様に、例 3 でコンパイラがコンパイル エラーをスローしないのはなぜですか?
フィールド定義の場合は宣言の順序が重要ですが、static readonly
フィールド定義の場合は重要ではありませんconst
。
編集:
文字列がこれらの特定の値に初期化される理由を理解しています。私が理解していないのは、例 2 がコンパイル エラーをスローし、変数の宣言ではなくコンストラクターで初期化を強制する理由です (これは完全に理にかなっています) が、例 3 は同じように動作しません。静的コンストラクターで初期化を強制する同じコンパイル エラーをスローするのは理にかなっていませんか?
もう一つの例
private static string test = test2;
private static string test2 = test;
この例は、私が説明しようとしていることを示しています。コンパイラは、静的コンストラクターで静的状態の初期化を強制できます (インスタンス変数の場合と同様)。コンパイラがそれを許可するのはなぜですか (またはコンパイラがインスタンス変数に対してこれを許可しないのはなぜですか)?