Generika verwendet in struct und class
Davon ausgehen, dass wir haben die folgenden struct
- definition, die verwendet Generika:
public struct Foo<T>
{
public T First;
public T Second;
public Foo(T first)
{
this.First = first;
}
}
Der compiler sagt
'Foo.Zweite " muss vollständig zugewiesen, bevor die Kontrolle an den Aufrufer zurückgegeben wird
Jedoch, wenn Foo
ist eine Klasse, dann ist es erfolgreich kompiliert.
public class Foo<T>
{
public T First;
public T Second;
public Foo(T first)
{
this.First = first;
}
}
Warum? Warum der compiler behandelt Sie anders? Außerdem, wenn kein Konstruktor definiert wird, in der ersten Foo
dann kompiliert. Warum dieses Verhalten?
- Wenn Sie eine struct, sollten Sie wirklich machen, es unveränderlich. Siehe mutable structs sind böse. Eine Möglichkeit, so dass es unveränderlich ist, zu sagen
public readonly T First; public readonly T Second;
. Dann ist es natürlich weisen alle Instanz-Felder in der Instanz-Konstruktor. Wenn auf der anderen Seite, Sie wirklich nicht wollen, zu ordnen, um Sie alle Felder, die Kette (implizite und Magische) parameterlosen Konstruktor, der natürlich, wie:: this()
(aber ich denke, Sie wissen, dass).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist, da ein compiler-Regel erzwingt, dass alle Felder in einem struct zugewiesen werden muss, bevor die Steuerung verlässt jeder Konstruktor.
Können Sie Ihr code funktioniert, indem dies zu tun:
Siehe auch Warum Muss ich die Initialisierung Aller Felder in meinem C# - Struktur mit einer Nicht-Standard-Konstruktor?
Out()
Attribut geschrieben werden, aber nichts in der CLS-spec rechtfertigt eine solche Annahme beim Aufruf externer Funktionen. Wenn eine virtuelle Methode mit einerout
parameter außer Kraft gesetzt wird, in einer Sprache, die nicht wissen, über dieOut()
- Attribut, die Sprache wird hinsichtlich der parameter alsref
parameter der überschreibenden Methode kann schreiben oder nicht, wie sieht es passt. Es ist erwähnenswert, dassvar it = new StructType(params);
nicht...it
; der compiler kann einfach den Konstruktor mutieren Sie die Felder der bestehendenit
Instanz direkt. Sie können davon ausgehen, dass alle Felder geschrieben werden, bevor Sie gelesen wird, aber in Wirklichkeit gibt es keine Garantie, dass alle von Ihnen geschrieben werden.Das ist eine Forderung der Strukturen im Allgemeinen-es hat nichts zu tun mit Generika. Dein Konstruktor muss einen Wert zuweisen, um alle Felder.
Hinweis: der gleiche Fehler passiert, hier:
Weil es eine Regel ist, in C#, dass alle Felder müssen zugeordnet werden Strukturen (inline oder im Konstruktor). Dies ist wegen der ein struct Natur. Es hat nichts über generische oder nicht-generische.
Die anderen Antworten erklären das Verhalten korrekt, aber vernachlässigen zu erwähnen, den zweiten Teil Ihrer Frage angeht, so ist es hier für die Fertigstellung.
Wenn Sie nicht explizit definieren Sie einen Konstruktor, erzeugt der compiler einen default-Konstruktor weist die default-Werte (z.B.
null
für Objekte,0
für zahlen usw.) zu jedem Feld.