Кажется, это зависит от последовательности строк. Этот код работает:
static private List<int> a = new List<int>() { 1 };
static private List<int> b = new List<int>() { a[0] };
пока этот код не работает (выдает NullReferenceException
)
static private List<int> a = new List<int>() { b[0] };
static private List<int> b = new List<int>() { 1 };
Итак, очевидно, что никаких правил для циклической зависимости не существует. Однако странно, что компилятор не жалуется ...
РЕДАКТИРОВАТЬ - Что происходит "между файлами"? Если мы объявим эти два класса:
public class A {
public static List<int> a = new List<int>() { B.b[0] };
}
public class B {
public static List<int> b = new List<int>() { A.a[0] };
}
и попробуйте получить к ним доступ с помощью этого кода:
try { Console.WriteLine(B.b); } catch (Exception e) { Console.WriteLine(e.InnerException.Message.); }
try { Console.WriteLine(A.a); } catch (Exception e) { Console.WriteLine(e.InnerException.Message); }
try { Console.WriteLine(B.b); } catch (Exception e) { Console.WriteLine(e.InnerException.Message); }
мы получаем этот вывод:
The type initializer for 'A' threw an exception.
Object reference not set to an instance of an object.
The type initializer for 'A' threw an exception.
Таким образом, инициализация B
вызывает исключение в статическом конструкторе A
и поле lefts a
со значением по умолчанию (null). Поскольку a
равно null
, b
также не может быть правильно инициализировано.
Если у нас нет циклических зависимостей, все работает нормально.
РЕДАКТИРОВАТЬ: На всякий случай, если вы не читали комментарии, Джон Скит дает очень интересное чтение: Различия между статическими конструкторами и инициализаторами типов .