У меня есть три класса: Base
, Derived
и Final
. Производное
происходит от Базовое
и Окончательное
происходит от Производное
. Все три класса имеют статический конструктор. Класс Производный
как открытый статический метод с именем Setup
. Когда я вызываю Final.Setup
, я ожидаю, что все три статических конструктора будут выполнены, но будет запущен только один из 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
?
Я могу исправить это, вызвав статический метод без операции Base
или обратившись к некоторому фиктивному статическому методу из База
. Но мне было интересно: в чем причина такого странного поведения?