次のコード例を検討してください。
public class A<T>
{
public static T TheT { get; set; }
}
public class B : A<string>
{
static B() {
TheT = "Test";
}
}
public class Program {
public static void Main(String[] args) {
Console.WriteLine(B.TheT);
}
}
ここB.TheT
はヌルです。ただし、次のMain
ようにメソッドを変更します。
public static void Main() {
new B();
Console.WriteLine(B.TheT);
}
B.TheT
予想どおり、「テスト」です。これにより静的コンストラクターが強制的に実行されることは理解できますが、最初のケースでこれが発生しないのはなぜですか?
仕様を読んでみましたが、これが私の注意を引きました (§10.12):
[...] 静的コンストラクターの実行は、アプリケーション ドメイン内で発生する次のイベントの最初のイベントによってトリガーされます。
• [...]
• クラス型の静的メンバーのいずれかが参照されている。
これについての私の解釈は、 はTheT
のメンバーではないためB
、 の静的コンストラクターB
は強制的に実行されないということです。これは正しいです?
それが正しい場合、どのB
ように初期化する方法を指定するのが最善でしょうTheT
か?