Es scheint von der Reihenfolge der Zeilen abhängig zu sein. Dieser Code funktioniert:
static private List a = new List() { 1 };
static private List b = new List() { a[0] };
während dieser Code nicht funktioniert (er wirft eine NullReferenceException
)
static private List a = new List() { b[0] };
static private List b = new List() { 1 };
Es gibt also offensichtlich keine Regeln für zyklische Abhängigkeiten. Es ist jedoch merkwürdig, dass der Compiler nicht meckert...
EDIT - Was passiert "über Dateien hinweg"? Wenn wir diese beiden Klassen deklarieren:
public class A {
public static List a = new List() { B.b[0] };
}
public class B {
public static List b = new List() { A.a[0] };
}
und versuchen, auf sie mit diesem Code zuzugreifen:
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); }
erhalten wir diese Ausgabe:
Der Typinitialisierer für 'A' hat eine Ausnahme ausgelöst.
Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
Der Typinitialisierer für 'A' hat eine Ausnahme ausgelöst.
Die Initialisierung von B
verursacht also eine Ausnahme im statischen Konstruktor A
und setzt das Feld a
auf den Standardwert (null). Da a
null ist, kann auch b
nicht ordnungsgemäß initialisiert werden.
Wenn wir keine zyklischen Abhängigkeiten haben, funktioniert alles einwandfrei.
EDIT: Nur für den Fall, dass Sie die Kommentare nicht gelesen haben, Jon Skeet bietet eine sehr interessante Lektüre: Die Unterschiede zwischen statischen Konstruktoren und Typinitialisierern.
0 Stimmen
Ich denke, dass dies auch bei Dateien (d. h. bei verschiedenen Klassen) passieren wird. Während der Typinitialisierung von Klasse A wird Klasse B aufgefordert, initialisiert zu werden, und Klasse B wird eine Nullreferenz zu Klasse A finden.
0 Stimmen
Jetzt, über Dateien derselben Klasse (Teilklasse), liegt es wahrscheinlich am Pre-Prozessor zu bestimmen, ob es fehlschlägt oder nicht.
0 Stimmen
So, wenn A auf B.b verweist, wird A.a, wenn es initialisiert wird, B.b erhöhen?