Freigeben über


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 oder in 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- oder out-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 oder internal).
  • Der statische Konstruktor muss parameterlos sein.
  • Der statische Konstruktor darf nicht base() oder this() 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 structFeldinitialisierer 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 oder protected sein, es sei denn, der Typ ist sealed.
  • 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 oder in 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- 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- oder out-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 und class, aber nicht für interface-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 auf ref struct-Parameter zugegriffen werden.
  • In einem ref struct-Typ können primäre Konstruktorparameter mit den Modifizierern in, ref oder out 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 oder readonly 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 einer readonly Struktur zurückgegeben werden.
  • Primäre Konstruktorparameter und ihre Member können keine ref- oder out-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