Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel werden die folgenden Compilerfehler behandelt:
- CS0132: "constructor": Ein statischer Konstruktor muss parameterlos sein.
- 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.
- CS0573: 'Felddeklaration': Es können keine Instanzfeldinitialisierer in Strukturen vorhanden sein.
- CS0710: Statische Klassen können keine Instanzkonstruktoren haben.
- CS0768: Der Konstruktor kann sich nicht über einen anderen Konstruktor selbst aufrufen.
- CS1018: Schlüsselwort „this“ oder „base“ erwartet.
- 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 Kontext mehrdeutig zwischen einem Typ und einem Parameter.
- 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,outoderinkann 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
- CS9018: Die automatisch implementierte Eigenschaft wird vor der expliziten Zuweisung gelesen, was zu einer vorherigen impliziten Zuweisung von "default" führt.
- CS9019: Das Feld wird vor der expliziten Zuweisung gelesen, was zu einer vorherigen impliziten Zuordnung von "default" führt.
- CS9020: Das "this"-Objekt wird gelesen, bevor alle Felder zugewiesen wurden, was zu vorherigen impliziten Zuordnungen von 'default' zu nicht explizit zugewiesenen Feldern führt.
- CS9021: Das Steuerelement wird an den Aufrufer zurückgegeben, bevor die automatisch implementierte Eigenschaft explizit zugewiesen wird, was zu einer vorherigen impliziten Zuordnung von "default" führt.
- CS9022: Das Steuerelement wird an den Aufrufer zurückgegeben, bevor das Feld explizit zugewiesen wird, was zu einer vorherigen impliziten Zuordnung von "default" führt.
Statische Konstruktoren
- CS0132: "constructor": Ein statischer Konstruktor muss parameterlos sein.
- CS0514: Ein statischer Konstruktor kann keinen expliziten „this“- oder „base“-Konstruktoraufruf enthalten.
- CS0515: Zugriffsmodifizierer sind bei statischen Konstruktoren nicht zulässig.
Statische Konstruktoren initialisieren statische Daten für einen Typ. Weitere Informationen finden Sie unter Statische Konstruktoren.
Um diese Fehler zu beheben, stellen Sie sicher, dass ihre statische Konstruktordeklaration die folgenden Regeln erfüllt:
- Entfernen Sie alle Parameter aus der statischen Konstruktordeklaration, da ein statischer Konstruktor parameterlos sein muss (CS0132). Wenn Sie Initialisierungswerte übergeben müssen, sollten Sie statische Felder oder Eigenschaften verwenden, die Sie vor der Ausführung des statischen Konstruktors festlegen.
- Entfernen Sie alle Zugriffsmodifizierer wie
public,protected,privateoderinternalaus dem statischen Konstruktor, da die Ausführung des statischen Konstruktors von der Laufzeit gesteuert wird und Zugriffsmodifizierer daher nicht sinnvoll sind (CS0515). - Entfernen Sie alle Konstruktor-Initialisierungsaufrufe, wie
: base()oder: this(), aus dem statischen Konstruktor, da statische Konstruktoren nicht mit anderen Konstruktoren (CS0514) verkettet werden können. Die Laufzeit ruft automatisch den statischen Konstruktor der Basisklasse auf, falls vorhanden.
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.
Sie können Konstruktoren nur in class und struct Typen deklarieren, einschließlich record class und record struct Typen. Weitere Informationen finden Sie unter Instanzkonstruktoren.
Um diese Fehler zu beheben, probieren Sie die folgenden Vorschläge aus:
Verschieben Sie den Konstruktor zu einem class oder struct einem Typ, da Sie Konstruktoren nicht in interface oder enum Typen (CS0526, CS8054) deklarieren können. Schnittstellen definieren Verträge, stellen jedoch keine Initialisierungslogik bereit, und Enumerationstypen haben ihre Werte zur Kompilierungszeit definiert.
Entfernen Sie Instanzkonstruktoren aus statischen Klassen, da statische Klassen nicht instanziiert werden können und daher keine Instanzkonstruktoren (CS0710) aufweisen können. Wenn Sie Initialisierungslogik benötigen, verwenden Sie stattdessen einen statischen Konstruktor.
Ändern Sie in Parameter in Pass-by-Value-Parameter in Attributkonstruktoren, da Attributkonstruktoren Parametermodifizierer (in) nicht unterstützen. Die Laufzeit instanziiert Attribute mithilfe von Spiegelung, die den in Modifizierer nicht unterstützt.
Entfernen Sie den Initialisierer : base() oder : this() von einem extern Konstruktor, da extern-Konstruktoren nicht mit anderen Konstruktoren (CS8091) koppeln können. Die Implementierung eines externen Konstruktors wird extern bereitgestellt, sodass die Konstruktorkette nicht möglich ist.
Die folgende Warnung kann für Konstruktordeklarationen generiert werden:
- CS0824: Konstruktor ist extern markiert.
Wenn ein Konstruktor markiert externist, kann der Compiler nicht überprüfen, ob eine Implementierung vorhanden ist. Um diese Warnung zu unterdrücken, stellen Sie entweder eine nicht externe Implementierung bereit, oder stellen Sie sicher, dass die externe Implementierung ordnungsgemäß verknüpft ist.
Konstruktoren in struct-Typen
- CS0568: Strukturen können keine expliziten parameterlosen Konstruktoren enthalten.
- CS0573: 'Felddeklaration': Es können keine Instanzfeldinitialisierer in Strukturen vorhanden sein.
- 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.
Strukturtypen weisen spezifische Regeln für Konstruktoren und Feldinitialisierung auf. Weitere Informationen finden Sie im Abschnitt "Strukturinitialisierung und Standardwerte " des Artikels "Strukturtypen ".
Um diese Fehler zu beheben, probieren Sie die folgenden Vorschläge aus:
- Führen Sie ein Upgrade auf C# 10 oder höher durch, wenn CS0568 oder CS0573 auftritt, da diese Fehler nur in älteren C#-Versionen auftreten. Modern C# ermöglicht explizite parameterlose Konstruktoren und Feldinitialisierer in Anweisungen.
- Fügen Sie den
publicZugriffsmodifizierer einem parameterlosen Strukturkonstruktor hinzu, da parameterlose Strukturkonstruktoren öffentlich sein müssen, um sicherzustellen, dass der Ausdruck und diedefaultArrayzuordnung Instanzen der Struktur ordnungsgemäß initialisieren kann (CS8958). - Fügen Sie einen
: this(...)Initialisierer zu explizit deklarierten Konstruktoren in einer Struktur mit einem primären Konstruktor hinzu, da alle nicht parameterlosen Konstruktoren mit dem primären Konstruktor oder einem anderen explizit deklarierten Konstruktor verkettet werden müssen, um eine konsistente Initialisierung (CS8982) sicherzustellen. - Deklarieren Sie einen expliziten Konstruktor, wenn die Struktur Feldinitialisierer verwendet, da der Compiler einen expliziten Konstruktor erfordert, um sicherzustellen, dass Feldinitialisierer aufgerufen werden (CS8983). Dieser Konstruktor kann ein parameterloser Konstruktor mit einem leeren Rumpf sein.
Die folgenden Warnungen deuten darauf hin, dass ein Feld oder eine Eigenschaft nicht explizit zugewiesen wird, bevor das Steuerelement gelesen oder bevor das Steuerelement an den Aufrufer zurückgegeben wird:
- CS9018: Die automatisch implementierte Eigenschaft wird vor der expliziten Zuweisung gelesen, was zu einer vorherigen impliziten Zuweisung von "default" führt.
- CS9019: Das Feld wird vor der expliziten Zuweisung gelesen, was zu einer vorherigen impliziten Zuordnung von "default" führt.
- CS9020: Das Objekt "this" wird vor der Zuweisung aller Felder gelesen, was zu vorherigen impliziten Zuordnungen von 'default' zu nicht explizit zugewiesenen Feldern führt.
- CS9021: Das Steuerelement wird an den Aufrufer zurückgegeben, bevor die automatisch implementierte Eigenschaft explizit zugewiesen wird, was zu einer vorherigen impliziten Zuordnung von "default" führt.
- CS9022: Das Steuerelement wird an den Aufrufer zurückgegeben, bevor das Feld explizit zugewiesen wird, was zu einer vorherigen impliziten Zuordnung von "default" führt.
Um diese Warnungen zu stillen, weisen Sie explizit alle Felder und automatisch implementierten Eigenschaften zu, bevor sie gelesen werden, oder bevor das Steuerelement vom Konstruktor zurückgegeben wird (CS9018, CS9019, CS9020, CS9021, CS9022). Wenn nicht zugewiesene Member gelesen werden, weist der Compiler ihnen implizit default zu, was möglicherweise nicht das gewünschte Verhalten ist.
Konstruktoraufrufe mit base und this
- CS0516: Ein Konstruktor kann sich nicht selbst aufrufen.
- CS0517: "Class" 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.
- CS1018: Schlüsselwort "this" oder "base" erwartet.
Mithilfe von Konstruktorinitialisierern kann ein Konstruktor einen anderen Konstruktor mithilfe : this() oder : base()aufrufen. Weitere Informationen finden Sie unter Verwenden von Konstruktoren.
Um diese Fehler zu beheben, probieren Sie die folgenden Vorschläge aus:
- Unterbrechen Sie alle Zirkelkonstruktoraufrufketten, da sich ein Konstruktor nicht direkt oder indirekt über einen anderen Konstruktor (CS0516, CS0768) aufrufen kann. Stellen Sie sicher, dass die Konstruktorkette schließlich auf einem Konstruktor endet, der keinen anderen Konstruktor in demselben Typ aufruft.
- Entfernen Sie den
: base()Initialisierer aus Konstruktoren in Strukturtypen oder aus Konstruktoren in System.Object, da diese Typen keinen Basisklassenkonstruktor zum Aufrufen haben (CS0517, CS0522). Strukturtypen erben implizit von System.ValueType, aber Sie können den Konstruktor nicht explizit aufrufen. - Schließen Sie den Konstruktorinitialisierer ab, oder entfernen Sie den Doppelpunkt (
:) aus der Konstruktordeklaration. Wenn ein Doppelpunkt einer Konstruktorsignatur folgt, erwartet der Compiler entwederthis()oderbase()(CS1018). Fügen Sie entweder den entsprechenden Konstruktoraufruf hinzu, oder entfernen Sie den Doppelpunkt vollständig, wenn keine Verkettung beabsichtigt ist.
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.
In einem abgeleiteten Datensatztyp muss der explizite Kopierkonstruktor den Kopierkonstruktor des Basistyps mithilfe des : this() Initialisierers aufrufen. Wenn der Datensatz direkt von System.Object erbt, kann er stattdessen den parameterlosen Objektkonstruktor aufrufen, CS8868.
Datensätze enthalten einen Compiler-synthetisierten Kopierkonstruktor. Sie können einen expliziten Kopierkonstruktor schreiben, müssen jedoch bestimmte Anforderungen erfüllen. Der Compiler generiert Fehler, wenn Datensatzkopiekonstruktoren gegen diese Anforderungen verstoßen:
- Der Basistyp muss über einen Konstruktor für barrierefreie Kopien verfügen. Alle
recordTypen verfügen über einen Kopierkonstruktor. Stellen Sie sicher, dass der Basistyp einrecordist, oder fügen Sie ihm einen barrierefreien Kopierkonstruktor hinzu (CS8867). - In einem abgeleiteten Datensatztyp muss der explizite Kopierkonstruktor den Kopierkonstruktor des Basistyps mithilfe des
: base()Initialisierers aufrufen. Wenn der Datensatz direkt von System.Object erbt, kann er stattdessen den parameterlosen Objektkonstruktor (CS8868) aufrufen. - Kopierkonstruktoren müssen
publicsein oderprotectedes sei denn, der Datensatztyp istsealed. Fügen Sie dem Kopierkonstruktor (CS8878) den entsprechenden Zugriffsmodifizierer hinzu. - Wenn ein expliziter Kopierkonstruktor dieselbe Signatur wie der synthetisierte Kopierkonstruktor aufweist, treten Konflikte zwischen den Definitionen auf. Entfernen Sie den expliziten Kopierkonstruktor, oder ändern Sie dessen Signatur (CS8910).
Primäre Konstruktordeklaration
Primäre Konstruktoren deklarieren Parameter direkt in der Typdeklaration. Der Compiler synthetisiert ein Feld, um einen primären Konstruktorparameter zu speichern, wenn Sie ihn in Membern oder Feldinitialisierern verwenden.
Verkettung von Konstruktoren
- CS8861: Unerwartete Argumentliste.
- CS8862: Ein Konstruktor, der in einem Typ mit Parameterliste deklariert ist, muss über den Konstruktorinitialisierer „this“ verfügen.
- CS9122: Unerwartete Parameterliste.
Wenn ein Typ über einen primären Konstruktor verfügt, müssen alle anderen explizit deklarierten Konstruktoren mittels : this(...) verkettet werden. Fügen Sie einen : this(...) Initialisierer hinzu, der geeignete Argumente an den primären Konstruktor (CS8862) übergibt.
Entfernen Sie eine Parameterliste aus dem Basistypverweis, wenn der Basistyp keinen primären Konstruktor aufweist. Die Syntax class Derived : Base(args) ist nur gültig, wenn Base ein primärer Konstruktor (CS8861) vorhanden ist. Entfernen Sie in ähnlicher Weise eine primäre Konstruktorparameterliste aus einer interface Deklaration, da Schnittstellen keine primären Konstruktoren (CS9122) haben können.
Parameterverwendung in Basiskonstruktoraufrufen
- CS9105: In diesem Kontext kann der primäre Konstruktorparameter nicht verwendet werden.
- CS9106: Der Bezeichner ist in diesem Kontext bei Typ und Parameter mehrdeutig.
Sie können primäre Konstruktorparameter nur im Basiskonstruktoraufruf verwenden, wenn Sie sie als Teil der primären Konstruktordeklaration übergeben. Um CS9105 zu beheben, verschieben Sie die Parameterverwendung in die Basisklausel der Typdeklaration, anstatt sie in einem explizit deklarierten Konstruktoraufruf : base() zu verwenden.
Wenn ein Typ und ein primärer Konstruktorparameter denselben Namen aufweisen, wird der Verweis mehrdeutig. Um CS9106 zu beheben, benennen Sie entweder den Typ oder den Parameter um.
Ähnlich wie Ref-Typ-Parameter
- 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,outoderinkann nicht in einem Instanzmember verwendet werden. - CS9110: Primäre Konstruktorparameter mit einem ref-ähnlichen Typ können nicht in einem Instanzmember verwendet werden.
- CS9136: Der primäre Konstruktorparameter des Typs kann nicht innerhalb eines Instanzmembers verwendet werden.
So beheben Sie diese Fehler:
- Primäre Konstruktorparameter vom
ref structTyp haben Einschränkungen, wo Sie sie verwenden können. Verschieben des Parameterzugriffs aus Lambda-Ausdrücken, Abfrageausdrücken oder lokalen Funktionen (CS9108). In Typen, die keineref structsind, greifen Sie aufref structParameter nur in Feldinitialisierern oder dem Konstruktor-Körper zu, nicht in Instanzmitgliedern (CS9110, CS9136). - Für
ref structTypen können Sie keine primären Konstruktorparameter mitin,refoderoutModifizierern in Instanzenmethoden oder Eigenschaftsaccessoren verwenden. Kopieren Sie den Parameterwert in ein Feld im Konstruktor, und verwenden Sie dieses Feld stattdessen in Instanzmember (CS9109).
Strukturtypen-Einschränkungen
- 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.
- CS9120: Der primäre Konstruktorparameter kann nicht durch Verweis zurückgegeben werden.
- CS9121: Der primäre Strukturkonstruktorparameter des Typs verursacht eine Schleife im Strukturlayout.
So beheben Sie diese Fehler:
- In Strukturtypen können Sie keine primären Konstruktorparameter in Lambda-Ausdrücken, Abfrageausdrücken oder lokalen Funktionen innerhalb von Instanzmitgliedern erfassen. Kopieren Sie den Parameter in eine lokale Variable oder ein lokales Feld, bevor Sie ihn in diesen Kontexten verwenden (CS9111, CS9112).
- Primäre Konstruktorparameter können nicht durch Verweis in Strukturtypen zurückgegeben werden. Speichern Sie den Wert in einem Feld, und geben Sie dieses Feld nach Bedarf (CS9120) zurück.
- Stellen Sie sicher, dass der Typ eines Parameters des primären Konstruktors keinen Zyklus im Strukturlayout auslöst. Eine Struktur kann weder direkt noch indirekt (CS9121) ein Feld eines eigenen Typs enthalten.
Readonly-Struktureinschränkungen
- 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).
So beheben Sie diese Fehler:
- In
readonly structTypen können Sie keine primären Konstruktorparameter und deren Member außerhalb von init-only Settern oder Variableninitialisierern ändern. Verschieben Sie Zuweisungen zu Feldinitialisierern oder Init-only-Eigenschaftensettern (CS9114, CS9117). - In
readonly struct-Typen können Sie keine primären Konstruktorparameter und deren Member als beschreibbare Referenzen zurückgeben. Rückgabe perreadonly refoder stattdessen als Wert (CS9115, CS9118). - Sie können primäre Konstruktorparameter und ihre Member nicht als
ref- oderout-Argumente inreadonly struct-Typen übergeben. Übergeben Sie sie stattdessen nach Wert oder alsinArgumente (CS9116, CS9119).
Warnungen für erfasste und schattierte Parameter
- 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 einschließenden Typs erfasst, und sein Wert wird auch verwendet, um ein Feld, eine Eigenschaft oder ein Ereignis zu initialisieren.
- CS9179: Der Parameter "Primärer Konstruktor" wird von einem Element aus der Basis schattiert.
Die folgenden Warnungen zeigen potenzielle Probleme mit der Speicherung oder dem Zugriff auf primäre Konstruktorparameter an:
- Sie können einen Parameter zweimal speichern, wenn Sie ihn an den Basiskonstruktor übergeben und im abgeleiteten Typ darauf zugreifen. Möglicherweise haben Sie eine Kopie in der Basisklasse und eine andere in der abgeleiteten Klasse. Überlegen Sie, ob Sie beide Kopien benötigen oder den Code neu strukturieren müssen, um die Duplizierung (CS9107) zu vermeiden.
- Sie benötigen keinen primären Konstruktorparameter, wenn Sie ihn nie lesen. Entfernen Sie nicht verwendete Parameter aus der primären Konstruktordeklaration (CS9113).
- Sie können einen Parameter zweimal speichern, wenn Sie ihn sowohl im umschließenden Typ erfassen als auch zum Initialisieren eines Felds, einer Eigenschaft oder eines Ereignisses verwenden. Erwägen Sie die direkte Verwendung des erfassten Parameters, anstatt ein separates Element (CS9124) zu initialisieren.
- Ein Mitglied eines Basistyps überschattet einen primären Konstruktorparameter, wenn beide denselben Namen haben. Benennen Sie den Parameter um, um Verwirrung zu vermeiden (CS9179).