Ursachen:
Strukturelement 'Unit.u' vom Typ 'Unit' verursacht einen Zyklus in der Struktur Layout.
Aber
%Vor% kompiliert. Ich verstehe das Problem, das ich vermute. Ein endloser Zyklus wird gebildet, wenn auf ein Objekt Unit
verwiesen wird, da ein anderes Mitglied Unit
usw. initialisiert werden muss. Aber warum schränkt der Compiler das Problem nur für structs
ein? Bleibt das Problem nicht auch für class
bestehen? Fehle ich etwas?
Das Problem liegt in Layout .
Wenn Unit
eine Struktur ist, müsste jeder Wert für eine Unit
ad infinitum einen anderen Wert desselben Typs (und damit derselben Größe) enthalten. Das ist nicht möglich. Ich nehme an, Sie könnten argumentieren, dass die Felder für Unit
keine anderen Felder belegen sollten, also könnten Sie es in sich selbst enthalten - aber ich glaube, dass die Art und Weise, wie die CLR funktioniert, alle Strukturen sicherstellt nehmen Sie mindestens 1 Byte auf ...
Wenn Unit
eine Klasse ist, muss ein Unit
-Objekt nur eine Referenz auf ein anderes Unit
-Objekt enthalten. Keine Speicherprobleme, und der Wert kann null sein, um damit zu beginnen.
Stellen Sie sich das so vor: Sie können kein Haus haben, das ein anderes Haus enthält, das nach dem gleichen Plan gebaut wurde, aber Sie können sicherlich ein Haus haben, das ein Stück Papier mit einer ähnlichen Hausadresse enthält ...
Klassen sind Referenztypen, daher stelle ich mir den Unterschied vor, dass im Beispiel class
nur ein Verweis auf eine andere Instanz gespeichert werden muss. Für Ihren struct
, einen Werttyp, müsste die gesamte Struktur erneut eingefügt werden, daher eine Endlosschleife.
Der struct
wird automatisch mit einem Wert initialisiert. In diesem Beispiel enthält ein Unit
-Wert einen Unit
-Wert, der einen Unit
-Wert enthält, der einen Unit
-Wert usw. enthält.
Ihr class
-Beispiel initialisiert nur den Verweis auf null
, der keinen unendlichen Rückschritt hat. Sie würden jedoch ein ähnliches Problem auftreten, wenn Sie Folgendes tun:
Nun konstruiert constructing ein Unit
ein Unit
, das ein Unit
erstellt, etc ... In diesem Fall werden Sie eine Laufzeit-Stack-Überlauf-Ausnahme finden, wenn / wenn Sie versuchen, ein Unit
zu instanziieren Objekt.
Ich dachte, Sie könnten das Problem struct
umgehen, indem Sie einen Nullable-Typ verwenden, aber das Problem bleibt bestehen. Ich glaube, das liegt daran, dass ein NULL-Wert struct
immer noch instanziiert wird, wenn auf null
gesetzt ist.
Weil Struct
value type
sind. Unit
kann den Wert als sich selbst halten? Ich denke, das ist nicht möglich.
Aber wenn Unit
ist class
, class
sind reference type
. Unit
-Objekt kann eine -Referenz für das andere Unit
-Objekt enthalten. Es ist in Ordnung.
Tags und Links class c# struct circular-dependency cyclic-reference