Кажется, что это зависит от последовательности линий. Этот код работает:
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 };
Таким образом, очевидно, никаких правил для циклической зависимости не существует. Специфично, однако, что компилятор не жалуется ...
EDIT - Что происходит с «файлами»? Если объявить эти два класса:
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
и поле слева a
со значением по умолчанию (null). Поскольку a
is null
, b
также не может быть правильно инициализирован.
Если у нас нет циклических зависимостей, все работает нормально.
EDIT: Только в случае, если вы не читали комментарии, Jon Skeet обеспечивает очень интересное чтение: The differences between static constructors and type initializers.
Я думаю, что через файлы (т. Е. Через разные классы) это произойдет одинаково. Во время инициализации типа класса A будет предложено инициализировать класс B, а класс B найдет нулевую ссылку на класс A. – Panos 2008-10-09 00:06:24
Теперь, в файлах того же класса (частичный класс), вероятно, зависит от препроцессора до определить, не терпит неудачу или нет. – Panos 2008-10-09 00:07:44
Итак, если A ссылается на B.b, тогда A.a получает доступ к buck B.b? – BCS 2008-10-09 00:09:22