Es scheint auf die Reihenfolge der Zeilen zu hängen. Dieser Code funktioniert:
static private List<int> a = new List<int>() { 1 };
static private List<int> b = new List<int>() { a[0] };
während dieser Code nicht funktioniert (es wirft ein NullReferenceException
)
static private List<int> a = new List<int>() { b[0] };
static private List<int> b = new List<int>() { 1 };
Also, natürlich keine Regeln für die zyklische Abhängigkeit existieren. Es ist jedoch eigenartig, dass der Compiler beschwert sich nicht ...
EDIT - Was „über Dateien“ passiert?
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] };
}
und versuchen, sie mit diesem Code zuzugreifen: Wenn wir diese zwei Klassen deklarieren
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); }
bekommen wir diese Ausgabe:
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.
So ist die Initialisierung von B
bewirkt ein Ausnahme im statischen Konstruktor A
und linken Feld a
mit dem Standardwert (null). Da a
null
ist, kann b
auch nicht richtig initialisiert werden.
Wenn wir keine zyklischen Abhängigkeiten haben, funktioniert alles gut.
EDIT: Gerade falls Sie nicht die Kommentare gelesen haben, bietet Jon Skeet eine sehr interessante Lektüre: The differences between static constructors and type initializers.
Ich denke, dass über Dateien (d. H. Über verschiedene Klassen) wird es gleich passieren. Während der Typinitialisierung von Klasse A wird Klasse B aufgefordert, zu initialisieren, und Klasse B wird einen Nullverweis auf Klasse A finden. – Panos
Nun, über Dateien der gleichen Klasse (Partialklasse), ist wahrscheinlich bis zum Pre-Prozessor zu festzustellen, ob es fehlschlägt oder nicht. – Panos
Wenn also A B.b referenziert, dann A.a, der sich einleitet, wird B.b stoßen? – BCS