、、の3つのクラスがBaseありDerivedますFinal。Derivedから派生しBase、からFinal派生しDerivedます。3つのクラスすべてに静的コンストラクターがあります。Derivedと呼ばれるパブリック静的メソッドとしてのクラスSetup。を呼び出すとFinal.Setup、3つの静的コンストラクターがすべて実行されると思いますが、実行されるのは1つだけDerivedです。
サンプルソースコードは次のとおりです。
abstract class Base
{
static Base()
{
System.Console.WriteLine ("Base");
}
}
abstract class Derived : Base
{
static Derived()
{
System.Console.WriteLine ("Derived");
}
public static void Setup()
{
System.Console.WriteLine ("Setup");
}
}
sealed class Final : Derived
{
static Final()
{
System.Console.WriteLine ("Final");
}
}
これは私には部分的にしか意味がありません。Final.Setup()呼び出しは実際にはのエイリアスにすぎないことを理解しているDerived.Setup()ので、で静的コンストラクターをスキップすることはFinal十分に公平に思えます。しかし、なぜ静的コンストラクターがBase呼び出されないのですか?
これを修正するには、のno-operation静的メソッドを呼び出すBaseか、のダミー静的メソッドにアクセスしBaseます。しかし、私は疑問に思っていました:この明らかに奇妙な行動の背後にある理由は何ですか?