Behandeln von Fehlern und Warnungen in Konstruktordeklarationen
In diesem Artikel werden die folgenden Compilerfehler behandelt:
- CS0514: statischer Konstruktor kann keinen expliziten „this“- oder „Basis“-Konstruktoraufruf enthalten.
- CS0515: Zugriffsmodifizierer sind bei statischen Konstruktoren nicht zulässig.
- CS0516: Konstruktor „Konstruktor“ kann sich nicht selbst aufrufen.
- CS0517: „Klasse“ hat keine Basisklasse und kann keinen Basiskonstruktor aufrufen.
- CS0522: Strukturen können keine Basisklassenkonstruktoren aufrufen.
- CS0526: Schnittstellen können keine Konstruktoren enthalten.
- CS0568: Strukturen können keine expliziten parameterlosen Konstruktoren enthalten.
- CS0710: Statische Klassen können keine Instanzkonstruktoren haben.
- CS0768: Ein Konstruktor kann sich nicht selbst über einen anderen Konstruktor aufrufen.
- CS8054: Enumerationen können keine expliziten parameterlosen Konstruktoren enthalten.
- CS8091: kann nicht extern sein und einen Konstruktor-Initialisierer haben.
- CS8861: Unerwartete Argumentliste.
- CS8862: Ein Konstruktor, der in einem Typ mit Parameterliste deklariert ist, muss einen „this“-Konstruktorinitialisierer haben.
- CS8358: Der Attribut-Konstruktor kann nicht verwendet werden, da er „in“-Parameter hat.
- CS8867: Kein zugänglicher Kopierkonstruktor im Basistyp gefunden „{0}“.
- CS8868: Ein Kopierkonstruktor in einem Datensatz muss einen Kopierkonstruktor der Basis aufrufen, oder einen parameterlosen Objektkonstruktor, wenn der Datensatz von object erbt.
- CS8878: Ein Kopierkonstruktor „{0}“ muss öffentlich oder geschützt sein, da der Datensatz nicht versiegelt ist.
- CS8910: Der primäre Konstruktor steht im Konflikt mit dem synthetischen Kopierkonstruktor.
- CS8958: Der parameterlose struct-Konstruktor muss „öffentlich“ sein.
- CS8982: Ein in einer Struktur mit Parameterliste deklarierter Konstruktor muss über einen this-Initialisierer verfügen, der den primären Konstruktor oder einen explizit deklarierten Konstruktor aufruft.
- CS8983: Eine „Struktur“ mit Feldinitialisierungen muss einen explizit deklarierten Konstruktor enthalten.
- CS9105: Der primäre Konstruktorparameter kann in diesem Kontext nicht verwendet werden.
- CS9106: Der Bezeichner ist in diesem Zusammenhang mehrdeutig zwischen Typ und Parameter.-Kasse ebenfalls.*
- CS9108: Innerhalb einer anonymen Methode, eines Lambda-Ausdrucks, eines Abfrageausdrucks oder einer lokalen Funktion kann kein Parameter verwendet werden, der einen verweisähnlichen Typ hat.
- CS9109: Kann keine
ref
,out
oderin
primären Konstruktorparameter innerhalb eines Instanzmembers verwenden. - CS9110: Primäre Konstruktorparameter mit einem verweisähnlichen Typ können nicht in einem Instanzmember verwendet werden.
- CS9111: Anonyme Methoden, Lambdaausdrücke, Abfrageausdrücke und lokale Funktionen in einem Instanzmember einer Struktur können nicht auf den primären Konstruktorparameter zugreifen.
- CS9112: Anonyme Methoden, Lambdaausdrücke, Abfrageausdrücke und lokale Funktionen innerhalb einer Struktur können nicht auf den primären Konstruktorparameter zugreifen, der auch in einem Instanzmember verwendet wird.
- CS9114: Ein primärer Konstruktorparameter eines schreibgeschützten Typs kann nicht zugewiesen werden (außer im reinen Initialisierungssetter des Typs oder in einem Variableninitialisierer).
- CS9115: Ein primärer Konstruktorparameter eines schreibgeschützten Typs kann nicht durch einen schreibbaren Verweis zurückgegeben werden.
- CS9116: Ein primärer Konstruktorparameter eines schreibgeschützten Typs kann nicht als Verweis- oder Out-Wert verwendet werden (außer im Init-Only Setter des Typs oder einem Variableninitialisierer).
- CS9117: Die Mitglieder des primären Konstruktorparameters eines schreibgeschützten Typs können nicht geändert werden (außer im Init-Only Setter des Typs oder einem Variableninitialisierer).
- CS9118: Member des primären Konstruktorparameters eines schreibgeschützten Typs können nicht von einem beschreibbaren Verweis zurückgegeben werden.
- CS9119: Member des primären Konstruktorparameters eines schreibgeschützten Typs können nicht als
ref
- oderout
-Wert verwendet werden (außer im reinen Initialisierungssetter des Typs oder in einem Variableninitialisierer). - CS9120: Der primäre Konstruktorparameter kann nicht durch Verweis zurückgegeben werden.
- CS9121: Der primäre Strukturkonstruktorparameter dieses Typs verursacht eine Schleife im Strukturlayout.
- CS9122: Unerwartete Parameterliste.
- CS9136: Der primäre Konstruktorparameter des Typs innerhalb eines Instanzmitglieds kann nicht verwendet werden.
Darüber hinaus werden in diesem Artikel die folgenden Warnungen behandelt:
- CS0824: Der Konstruktor „Name“ ist extern markiert.
- CS9107: Der Parameter wird im Zustand des eingeschlossenen Typs erfasst, und sein Wert wird auch an den Basiskonstruktor übergeben. Der Wert kann auch von der Basisklasse erfasst werden.
- CS9113: Der Parameter ist ungelesen.
- CS9124: Der Parameter wird im Zustand des eingeschlossenen Typs erfasst, und sein Wert wird auch verwendet, um ein Feld, eine Eigenschaft oder ein Ereignis zu initialisieren.
- CS9179: Primärer Konstruktorparameter wird von einem Element aus der Basis abgeschattet
Statische Konstruktoren
- CS0514: Statischer Konstruktor kann keinen expliziten „this“- oder „Basis“-Konstruktoraufruf haben.
- CS0515: Zugriffsmodifikatoren sind bei statischen Konstruktoren nicht erlaubt.
Sie können höchstens einen statischen Konstruktor für einen Typ schreiben. Die Deklaration eines statischen Konstruktors muss den folgenden Regeln entsprechen:
- Der statische Konstruktor enthält den Modifizierer
static
, aber keine anderen Modifizierer (z. B.public
,protected
,private
oderinternal
). - Der statische Konstruktor muss parameterlos sein.
- Der statische Konstruktor darf nicht
base()
oderthis()
aufrufen. Wenn die Basisklasse einen statischen Konstruktor enthält, ruft ihn die Runtime automatisch auf.
Konstruktordeklaration
- CS0526: Schnittstellen können keine Konstruktoren enthalten.
- CS0710: Statische Klassen können keine Instanzenkonstruktoren haben.
- CS8054: Enumerationen können keine expliziten parameterlosen Konstruktoren enthalten.
- CS8358: Der Attribut-Konstruktor kann nicht verwendet werden, da er „in“-Parameter hat.
- CS8091: in Konstruktor kann nicht extern sein und einen Konstruktor-Initialisierer haben.
Konstruktoren sind nur in den Typen class
und struct
zulässig, einschließlich der Typen record class
und record struct
. Sie können sie nicht in den Typen enum
oder interface
definieren. Darüber hinaus können Attributklassentypen keine in
-Parameter deklarieren. Übergeben Sie stattdessen Parameter nach Wert.
Sie können extern
-Konstruktoren deklarieren. Sie können jedoch nicht die Konstruktoraufrufe base()
oder this()
verwenden, um einen anderen Konstruktor aus einem als extern
deklarierten Konstruktor aufzurufen.
Darüber hinaus können die folgenden Warnungen für Konstruktordeklarationen generiert werden:
- CS0824: Konstruktor ist extern markiert.
Wenn ein Konstruktor als extern
markiert ist, kann der Compiler nicht garantieren, dass der Konstruktor vorhanden ist. Daher generiert der Compiler diese Warnung.
Konstruktoren in struct-Typen
- CS0568: Strukturen können keine expliziten parameterlosen Konstruktoren enthalten.
- CS8958: Der parameterlose struct-Konstruktor muss „öffentlich“ sein.
- CS8982: Ein in einer Struktur mit Parameterliste deklarierter Konstruktor muss über einen this-Initialisierer verfügen, der den primären Konstruktor oder einen explizit deklarierten Konstruktor aufruft.
- CS8983:Eine Struktur mit Feldinitialisierern muss einen explizit deklarierten Konstruktor enthalten.
Die neuesten Features in C# heben einige der früheren Einschränkungen für struct
-Typen auf. CS0568 wird generiert, wenn Sie in älteren Versionen von C# einen parameterlosen Instanzenkonstruktor deklarieren. Sobald Sie C# 10 verwenden, können Sie einen expliziten parameterlosen Instanzenkonstruktor deklarieren. Dieser explizite parameterlose Konstruktor muss public
sein. Wenn in struct
Feldinitialisierer deklariert werden, müssen Sie auch einen expliziten Instanzenkonstruktor deklarieren. Dieser Konstruktor kann ein parameterloser Konstruktor ohne Inhalt sein.
Wenn ein struct
-Typ einen primären Konstruktor deklariert (einschließlich record struct
-Typen), müssen alle anderen Instanzenkonstruktoren mit Ausnahme eines parameterlosen Konstruktors mit this()
den primären Konstruktor oder einen anderen explizit deklarierten Konstruktor aufrufen.
Konstruktoraufrufe mit base
und this
- CS0516:Ein Konstruktor kann sich nicht selbst aufrufen.
- CS0517: Klasse hat keine Basisklasse und kann keinen Basiskonstruktor aufrufen.
- CS0522: Strukturen können keine Basisklassenkonstruktoren aufrufen.
- CS0768: Der Konstruktor kann sich nicht über einen anderen Konstruktor selbst aufrufen.
Sie können base()
und this()
verwenden, damit ein Konstruktor einen anderen im selben Typ oder Basistyp aufrufen kann. Das Aufrufen von Konstruktoren kann doppelte Konstruktorlogik minimieren. Sie müssen die folgenden Regeln befolgen, wenn Sie einen anderen Konstruktor mit this()
oder base()
aufrufen:
Ein Konstruktor kann sich weder direkt noch indirekt über einen anderen Konstruktor selbst aufrufen. So ist beispielsweise der folgende Code ungültig:
public class C { public C() : this() // Error! { } } public class C2 { public class C2() : this(10) {} public class C2(int capacity) : this() { _capacity = capacity; } private int _capacity; } ``
struct-Typen können nicht
base()
aufrufen. Dies ist auch für System.Object nicht möglich.
Datensätze und Kopierkonstruktoren
- CS8867: Im Basistyp wurde kein zugänglicher Kopierkonstruktor gefunden.
- CS8868: Ein Kopierkonstruktor in einem Datensatz muss einen Kopierkonstruktor im Stamm aufrufen oder einen parameterlosen Objektkonstruktor, wenn der Datensatz von „Objekt“ erbt.
- CS8878: Ein Kopierkonstruktor muss „öffentlich“ oder „geschützt“ sein, da der Datensatz nicht versiegelt ist.
- CS8910: Der primäre Konstruktor verursacht einen Konflikt mit dem synthetisierten Kopierkonstruktor.
Durch Hinzufügen des Modifizierers record
zum Typ struct
oder class
wird ein Datensatz erstellt. Datensätze enthalten einen vom Compiler synthetisierten Kopierkonstruktor. Sie können selbst einen expliziten Kopierkonstruktor schreiben, müssen dabei jedoch die folgenden Regeln einhalten:
- Kopierkonstruktoren müssen
public
oderprotected
sein, es sei denn, der Typ istsealed
. - Kopierkonstruktoren müssen den
base()
-Kopierkonstruktor aufrufen, es sei denn, die Basisklasse ist System.Object. - Darüber hinaus muss der Basistyp über einen Kopierkonstruktor verfügen.
record
-Typen verfügen immer über einen Kopierkonstruktor.
Primäre Konstruktordeklaration
Der Compiler gibt die folgenden Fehler aus, wenn ein primärer Konstruktor gegen mindestens eine der Regeln für primäre Konstruktoren für Klassen und Strukturen verstößt:
- CS8861: Unerwartete Argumentliste.
- CS8862: Ein Konstruktor, der in einem Typ mit Parameterliste deklariert ist, muss über den Konstruktorinitialisierer „this“ verfügen.
- CS9105: In diesem Kontext kann der primäre Konstruktorparameter nicht verwendet werden.
- CS9106: Der Bezeichner ist in diesem Kontext bei Typ und Parameter mehrdeutig.
- CS9108: Kann keinen Parameter mit einem verweisähnlichen Typ in einer anonymen Methode, einem Lambdaausdruck, einem Abfrageausdruck oder einer lokalen Funktion verwenden.
- CS9109: Kann keine
ref
,out
oderin
primären Konstruktorparameter innerhalb eines Instanzmembers verwenden. - CS9110: Primäre Konstruktorparameter mit einem verweisähnlichen Typ können nicht in einem Instanzmember verwendet werden.
- CS9111: Anonyme Methoden, Lambdaausdrücke, Abfrageausdrücke und lokale Funktionen in einem Instanzmember einer Struktur können nicht auf den primären Konstruktorparameter zugreifen.
- CS9112: Anonyme Methoden, Lambdaausdrücke, Abfrageausdrücke und lokale Funktionen innerhalb einer Struktur können nicht auf den primären Konstruktorparameter zugreifen, der auch in einem Instanzmember verwendet wird.
- CS9114: Ein primärer Konstruktorparameter eines schreibgeschützten Typs kann nicht zugewiesen werden (außer im reinen Initialisierungssetter des Typs oder in einem Variableninitialisierer).
- CS9115: Ein primärer Konstruktorparameter eines schreibgeschützten Typs kann nicht von einem beschreibbaren Verweis zurückgegeben werden.
- CS9116: Ein primärer Konstruktorparameter eines schreibgeschützten Typs kann nicht als
ref
- oderout
-Wert verwendet werden (außer im reinen Initialisierungssetter des Typs oder in einem Variableninitialisierer). - CS9117: Member des primären Konstruktorparameters eines schreibgeschützten Typs können nicht geändert werden (außer im reinen Initialisierungssetter des Typs oder in einem Variableninitialisierer).
- CS9118: Member des primären Konstruktorparameters eines schreibgeschützten Typs können nicht von einem beschreibbaren Verweis zurückgegeben werden.
- CS9119: Member des primären Konstruktorparameters eines schreibgeschützten Typs können nicht als
ref
- oderout
-Wert verwendet werden (außer im reinen Initialisierungssetter des Typs oder in einem Variableninitialisierer). - CS9120: Der primäre Konstruktorparameter kann nicht durch Verweis zurückgegeben werden.
- CS9121: Der primäre Strukturkonstruktorparameter dieses Typs verursacht eine Schleife im Strukturlayout.
- CS9122: Unerwartete Parameterliste.
- CS9124: Der Parameter wird im Zustand des eingeschlossenen Typs erfasst, und sein Wert wird auch verwendet, um ein Feld, eine Eigenschaft oder ein Ereignis zu initialisieren.
- CS9136: Der primäre Konstruktorparameter des Typs innerhalb eines Instanzmembers kann nicht verwendet werden.
Primäre Konstruktorparameter befinden sich im Bereich dieses Typs. Der Compiler kann ein Feld synthetisieren, in dem der Parameter für die Verwendung in Membern oder in Feldinitialisierern gespeichert wird. Da ein primärer Konstruktorparameter in ein Feld kopiert werden kann, gelten die folgenden Einschränkungen:
- Primäre Konstruktoren können für die Typen
struct
undclass
, aber nicht fürinterface
-Typen deklariert werden. - Primäre Konstruktorparameter können nur als Teil des primären Konstruktors in einem
base()
-Konstruktoraufruf verwendet werden. - Auf primäre Konstruktorparameter vom Typ
ref struct
kann in Lambdaausdrücken, Abfrageausdrücken oder lokalen Funktionen nicht zugegriffen werden. - Wenn der Typ nicht
ref struct
ist, kann in Instanzmembern nicht aufref struct
-Parameter zugegriffen werden. - In einem
ref struct
-Typ können primäre Konstruktorparameter mit den Modifizierernin
,ref
oderout
nicht in Instanzmethoden oder Eigenschaftszugriffsmethoden verwendet werden.
Bei struct-Typen gelten die folgenden zusätzlichen Einschränkungen für primäre Konstruktorparameter:
- Primäre Konstruktorparameter können nicht in Lambdaausdrücken, Abfrageausdrücken oder lokalen Funktionen erfasst werden.
- Primäre Konstruktorparameter können nicht durch Verweis zurückgegeben werden (
ref
-Rückgabe oderreadonly ref
-Rückgabe).
Bei schreibgeschützten struct-Typen gelten die folgenden zusätzlichen Einschränkungen für primäre Konstruktorparameter:
- Primäre Konstruktorparameter und ihre Member können in einer
readonly
Struktur nicht neu zugewiesen werden. - Primäre Konstruktorparameter und ihre Member können nicht
ref
sein und in einerreadonly
Struktur zurückgegeben werden. - Primäre Konstruktorparameter und ihre Member können keine
ref
- oderout
-Argumente für Methoden sein.
In all diesen Fällen entsprechen die Einschränkungen für primäre Konstruktorparameter den Einschränkungen für Datenfelder in diesen Typen. Die Einschränkungen sind erforderlich, da ein primärer Konstruktorparameter in ein synthetisiertes Feld im Typ transformiert werden kann. Daher müssen primäre Konstruktorparameter die Regeln einhalten, die für dieses synthetisierte Feld gelten.
Ein abgeleiteter primärer Konstruktor ruft den primären Basiskonstruktor auf, indem er die Parameter an den Basiskonstruktor übergibt. Sie müssen die Parameternamen aus der abgeleiteten Konstruktordeklaration verwenden.
Die Warnungen geben Hinweise auf erfasste oder überschattete primäre Konstruktorparameter.
- CS9107: Der Parameter wird im Zustand des eingeschlossenen Typs erfasst, und sein Wert wird auch an den Basiskonstruktor übergeben. Der Wert kann auch von der Basisklasse erfasst werden. Diese Warnung gibt an, dass Ihr Code möglicherweise zwei Kopien eines primären Konstruktorparameters zugeordnet werden kann. Da der Parameter an die Basisklasse übergeben wird, wird er wahrscheinlich auch von der Basisklasse verwendet. Da die abgeleitete Klasse darauf zugreift, verfügt sie möglicherweise über eine zweite Kopie desselben Parameters. Dieser zusätzliche Speicher ist möglicherweise nicht vorgesehen.
- CS9113: Der Parameter ist ungelesen. Diese Warnung zeigt an, dass Ihre Klasse niemals auf den primären Konstruktor verweist, auch nicht, um ihn an den primären Basiskonstruktor zu übergeben. Er wird wahrscheinlich nicht benötigt.
- CS9124: Der Parameter wird im Zustand des eingeschlossenen Typs erfasst, und sein Wert wird auch verwendet, um ein Feld, eine Eigenschaft oder ein Ereignis zu initialisieren. Diese Warnung gibt an, dass der Konstruktorparameter eines geschachtelten Typs auch vom eingeschlossenen Typ erfasst wird. Der Parameter wird wahrscheinlich zweimal gespeichert.
- CS9179: Primärer Konstruktorparameter wird von einem Member aus der Basis abgeschattet
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für