Дорогой, вопрос, подобный этому, уже был уже задан, но среди ответов не было объяснения проблемы, которую я вижу.
Проблема: Руководство по программированию на С#:
Статический конструктор используется для инициализации любых статических данных или для выполнения определенного действия, которое требуется выполнить только один раз. Он вызывается автоматически до создания первого экземпляра или ссылки на любые статические члены.
В частности, статический конструктор вызывается до создания любого экземпляра класса. (Это не гарантирует, что статический конструктор заканчивается перед созданием экземпляра, но это совсем другая история.)
Рассмотрим пример кода:
using System;
public class Test
{
static public Test test = new Test();
static Test()
{
Console.WriteLine("static Test()");
}
public Test()
{
Console.WriteLine("new Test()");
}
}
public class Program
{
public static void Main()
{
Console.WriteLine("Main() started");
Console.WriteLine("Test.test = " + Test.test);
Console.WriteLine("Main() finished");
}
}
Он выводит:
Main() запущен
новый тест()
статический тест()
Test.test = Тест
Main() завершено
Итак, мы видим, что конструктор экземпляра заканчивается (и, таким образом, создается экземпляр) до запуска статического конструктора. Разве это не противоречит Руководству? Может быть, инициализация статических полей считается неявной частью статического конструктора?