Beheben von Fehlern und Warnungen in Konstruktordeklarationen
In diesem Artikel werden die folgenden Compilerfehler behandelt:
- CS0514: Ein statischer Konstruktor kann keinen expliziten „this“- oder „base“-Konstruktoraufruf enthalten.
- CS0515: Zugriffsmodifizierer sind bei statischen Konstruktoren nicht zulässig.
- CS0516: Der Konstruktor „constructor“ kann sich nicht selbst aufrufen.
- CS0517: „class“ 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: Der Konstruktor kann sich nicht über einen anderen Konstruktor selbst aufrufen.
- CS8054: Enumerationen können keine expliziten parameterlosen Konstruktoren enthalten.
- CS8091: kann nicht extern sein und über einen Konstruktorinitialisierer verfügen.
- CS8861: Unerwartete Argumentliste.
- CS8862: Ein Konstruktor, der in einem Typ mit Parameterliste deklariert ist, muss über den Konstruktorinitialisierer „this“ verfügen.
- CS8358: Der Attributkonstruktor kann nicht verwendet werden, da er „in“-Parameter aufweist.
- CS8867: Im Basistyp „{0}“ wurde kein zugänglicher Kopierkonstruktor gefunden.
- CS8868: Ein Kopierkonstruktor in einem Record muss einen Kopierkonstruktor der Basis aufrufen oder einen parameterlosen Objektkonstruktor verwenden, wenn der Record von einem Objekt erbt.
- CS8878: Der Kopierkonstruktor „{0}“ muss „public“ oder „protected“ sein, da der Datensatz nicht versiegelt ist.
- CS8910: Der primäre Konstruktor verursacht einen Konflikt mit dem synthetisierten Kopierkonstruktor.
- CS8958: Der parameterlose Strukturkonstruktor muss "public" 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.
- CS9105: In diesem Kontext kann kein Primärkonstruktorparameter verwendet werden.
- CS9106: Der Bezeichner ist in diesem Zusammenhang mehrdeutig zwischen Typ und Parameter.-Klasse ebenfalls.*
- CS9108: Parameter mit einem ref-ähnlichen Typ können nicht in einer anonymen Methode, einem Lambdaausdruck, einem Abfrageausdruck oder einer lokalen Funktion verwendet werden.
- CS9109: Der primäre Konstruktorparameter
ref
,out
oderin
kann nicht in einem Instanzmember verwendet werden. - CS9110: Primäre Konstruktorparameter mit einem ref-ähnlichen Typ können nicht in einem Instanzmember verwendet werden.
- CS9111: Anonyme Methoden, Lambda-Ausdrücke, Abfrageausdrücke und lokale Funktionen innerhalb eines Instanzmitglieds 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- oder out-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 des Typs verursacht eine Schleife im Strukturlayout.
- CS9122: Unerwartete Parameterliste.
- CS9136: Der primäre Konstruktorparameter des Typs kann nicht innerhalb eines Instanzmembers verwendet werden.
Darüber hinaus werden die folgenden Warnungen in diesem Artikel behandelt:
- CS0824: Der Konstruktor „name“ ist als extern markiert.
- CS9107: Der Parameter wird im Zustand des einschließenden 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 einschließenden 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 Member aus der Basis abgeschattet
Statische Konstruktoren
- CS0514: Ein statischer Konstruktor kann keinen expliziten „this“- oder „base“-Konstruktoraufruf enthalten.
- CS0515: Zugriffsmodifizierer sind bei statischen Konstruktoren nicht zulässig.
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 ein parameterloser Konstruktor sein.
- Der statische Konstruktor darf nicht
base()
oderthis()
aufrufen. Wenn die Basisklasse einen statischen Konstruktor enthält, ruft die Laufzeit sie automatisch auf.
Konstruktordeklaration
- CS0526: Schnittstellen können keine Konstruktoren enthalten.
- CS0710-: Statische Klassen können keine Instanzkonstruktoren haben.
- CS8054: Enumerationen können keine expliziten parameterlosen Konstruktoren enthalten.
- CS8358: Der Attributkonstruktor kann nicht verwendet werden, da er „in“-Parameter aufweist.
- CS8091: Ein Konstruktor kann nicht extern sein und über einen Konstruktorinitialisierer verfügen.
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 als Typ 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, jedoch können Sie keine base()
- oder this()
-Konstruktoraufrufe verwenden, um einen anderen Konstruktor aus einem Konstruktor aufzurufen, der extern
deklariert ist.
Darüber hinaus können die folgenden Warnungen für Konstruktordeklarationen generiert werden:
- CS0824: Konstruktor ist extern markiert.
Wenn ein Konstruktor 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 Strukturkonstruktor muss "public" sein.
- CS8982: Ein in einer "Struktur" mit Parameterliste deklarierter Konstruktor muss einen "this"-Initialisierer aufweisen, der den primären Konstruktor oder einen explizit deklarierten Konstruktor aufruft.
- CS8983: Eine "Struktur" mit Feldinitialisierern muss einen explizit deklarierten Konstruktor enthalten.
Aktuelle Features in C# entfernen frühere Einschränkungen für struct
Typen. CS0568 wird generiert, wenn Sie in älteren Versionen von C# einen parameterlosen Instanzkonstruktor deklarieren. Sie können einen expliziten parameterlosen Instanzkonstruktor in neueren Versionen von C# deklarieren. Dieser explizite parameterlose Konstruktor muss als public
bezeichnet sein. Wenn in struct
Feldinitialisierer deklariert werden, müssen Sie auch einen expliziten Instanzenkonstruktor deklarieren. Dieser Konstruktor kann ein parameterloser Konstruktor mit einem leeren Rumpf sein.
Wenn ein struct
Typ einen primären Konstruktor deklariert, einschließlich record struct
Typen, müssen alle anderen Instanzkonstruktoren außer einem parameterlosen Konstruktor den primären Konstruktor oder einen anderen explizit deklarierten Konstruktor mit this()
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 diese Regeln befolgen, wenn Sie einen anderen Konstruktor mithilfe von this()
oder base()
aufrufen:
Ein Konstruktor kann sich weder direkt noch indirekt über einen anderen Konstruktor selbst aufrufen. Der folgende Code ist beispielsweise illegal:
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 entweder einen Kopierkonstruktor der Basis aufrufen oder einen parameterlosen Objektkonstruktor verwenden, wenn der Datensatz von einem Objekt erbt.
- CS8878: Ein Kopierkonstruktor muss „public“ oder „protected“ 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 einen expliziten Kopierkonstruktor selbst schreiben, müssen 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 eine oder mehrere 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: Parameter mit einem ref-ähnlichen Typ können nicht in einer anonymen Methode, einem Lambdaausdruck, einem Abfrageausdruck oder einer lokalen Funktion verwendet werden.
- CS9109: Der primäre Konstruktorparameter
ref
,out
oderin
kann nicht in einem Instanzmember verwendet werden. - CS9110: Primäre Konstruktorparameter mit einem ref-ähnlichen Typ können nicht in einem Instanzmember verwendet werden.
- CS9111: Anonyme Methoden, Lambdaausdrücke, Abfrageausdrücke und lokale Funktionen innerhalb eines Instanzmemems einer Struktur können nicht auf den primären Konstruktorparameter zugreifen.
- CS9112: Anonyme Methoden, Lambda-Ausdrücke, Abfrageausdrücke und lokale Funktionen innerhalb einer Struktur können nicht auf den primären Konstruktorparameter zugreifen, der auch in einem Instanzmitglied 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 des Typs verursacht eine Schleife im Strukturlayout.
- CS9122: Unerwartete Parameterliste.
- CS9124: Der Parameter wird im Zustand des einschließenden 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 kann nicht innerhalb eines Instanzmembers verwendet werden.
Primäre Konstruktorparameter befinden sich im Bereich dieses Typs. Der Compiler kann ein Feld synthetisieren, das den Parameter für die Verwendung in Membern oder in Feldinitialisierern speichert. Da ein primärer Konstruktorparameter möglicherweise 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
ref struct
Typs kann in Lambda-Ausdrü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.
Strukturtypen haben die folgenden zusätzlichen Einschränkungen für primäre Konstruktorparameter:
- Primäre Konstruktorparameter können in Lambda-Ausdrücken, Abfrageausdrücken oder lokalen Funktionen nicht erfasst werden.
- Primäre Konstruktorparameter können nicht durch Verweis zurückgegeben werden (
ref
zurückgeben oderreadonly ref
zurückgeben).
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 liegen darin, dass ein primärer Konstruktorparameter in ein synthetisiertes Feld des Typs umgewandelt werden kann. Daher müssen primäre Konstruktorparameter die Regeln befolgen, 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 einschließenden Typs erfasst, und sein Wert wird auch an den Basiskonstruktor übergeben. Der Wert könnte auch von der Basisklasse erfasst werden. Diese Warnung gibt an, dass Ihrem Code möglicherweise zwei Kopien eines primären Konstruktorparameters zugeordnet werden. Da der Parameter an die Basisklasse übergeben wird, verwendet die Basisklasse sie wahrscheinlich. 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. Es ist wahrscheinlich nicht erforderlich.
- CS9124: Der Parameter wird im Zustand des einschließenden 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 einschließenden Typ erfasst wird. Der Parameter wird wahrscheinlich zweimal gespeichert.
- CS9179: Primärer Konstruktorparameter wird von einem Member aus der Basis abgeschattet