Почему в C # вызываются не все статические конструкторы (т.е. конструкторы родительских классов)?

У меня есть три класса: 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 или обратившись к некоторому фиктивному статическому методу из База . Но мне было интересно: в чем причина такого странного поведения?

6
задан Pierre Arnaud 28 June 2011 в 08:21
поделиться