Марк прав. Я бы просто добавил к его ответу, что на ваш вопрос отвечает раздел 10.5.5.1 спецификации, в котором говорится:
Инициализаторы переменных статического поля
класса соответствуют последовательности
назначения, которые выполняются в
текстовый порядок, в котором они появляются в
объявление класса. Если статический
конструктор существует в классе,
выполнение статического поля
инициализаторы происходят непосредственно перед
для выполнения этого статического конструктора.
В противном случае статическое поле
инициализаторы выполняются в
зависящее от реализации время до
первое использование статического поля
этот класс.
Обратите внимание на последний пункт. Спецификация продолжает приводить ваш точный пример как случай, когда любой порядок разрешен спецификацией; вся спецификация гарантирует, что инициализаторы полей выполняются в текстовом порядке до запуска статических конструкторов. Это не гарантирует инициализации полей одного типа до или после полей другого типа.
Например, jit-компилятору разрешено говорить «эй, я вижу, что типы A и B используются впервые в этом методе, который собирается соединиться, позвольте мне на минутку убедиться, что эти типы загружен «. В это время джиттеру разрешено выполнять инициализаторы полей, и он может сделать сначала A или B по своему усмотрению.
Короче говоря: (1) вы не можете полагаться на это поведение ; это определяется реализацией, и (2) спецификация отвечает на ваш точный вопрос; попробуйте прочитать спецификацию, если у вас есть вопрос о семантике языка .