Freigeben über


Beheben von Fehlern und Warnungen in Erweiterungsmitglieddeklarationen

In diesem Artikel werden die folgenden Compilerfehler behandelt:

  • CS1100: Die Methode weist einen Parametermodifizierer 'this' auf, der sich nicht auf dem ersten Parameter befindet.
  • CS1101: Der Parametermodifizierer 'ref' kann nicht mit 'this' verwendet werden.
  • CS1102: Der Parametermodifizierer 'out' kann nicht mit 'this' verwendet werden.
  • CS1103: Der erste Parameter einer Erweiterungsmethode darf nicht vom Zeigertyp sein.
  • CS1105: Erweiterungsmethoden müssen statisch sein.
  • CS1106: Erweiterungsmethoden müssen in einer nicht generischen statischen Klasse definiert werden.
  • CS1109: Erweiterungsmethoden müssen in statischen Klassen der obersten Ebene definiert werden, "name" ist eine geschachtelte Klasse.
  • CS1110: Eine neue Erweiterung kann nicht definiert werden, da der erforderliche Compilertyp ExtensionAttribute nicht gefunden werden kann. Fehlt ein Verweis auf System.Core.dll?
  • CS1112: Verwenden Sie nicht 'ExtensionAttribute'. Verwenden Sie stattdessen das Schlüsselwort "this".
  • CS1113: Erweiterungsmethode, die für einen Werttyp definiert ist, kann nicht zum Erstellen von Stellvertretungen verwendet werden.
  • CS1743: Der Standardwert für den Parameter "this" kann nicht angegeben werden.
  • CS9281: Erweiterungsdeklarationen haben möglicherweise keinen Namen.
  • CS9282: Erweiterungsdeklarationen können nur Methoden oder Eigenschaften enthalten.
  • CS9283: Erweiterungen müssen in einer nicht generischen, statischen Klasse auf oberster Ebene deklariert werden.
  • CS9284: Der Empfängerparameter einer Erweiterung darf keinen Standardwert aufweisen.
  • CS9285: Ein Erweiterungscontainer kann nur einen Empfängerparameter haben.
  • CS9287: Ein Empfängerparameter darf nicht denselben Namen wie ein Erweiterungscontainertypparameter haben.
  • CS9288: Ein Parameter, eine lokale Variable oder eine lokale Funktion kann nicht denselben Namen wie ein Parameter für den Erweiterungscontainertyp aufweisen.
  • CS9289: Der Membertypparameter hat denselben Namen wie ein Erweiterungscontainertypparameter.
  • CS9290: Ein Parameter, eine lokale Variable oder eine lokale Funktion kann nicht denselben Namen wie ein Erweiterungsparameter haben.
  • CS9291: 'value': Ein automatisch generierter Parametername ist mit einem Erweiterungsparameternamen in Konflikt.
  • CS9292: Ein Typparameter hat denselben Namen wie ein Erweiterungsparameter.
  • CS9293: In diesem Kontext kann kein Erweiterungsparameter verwendet werden.
  • CS9294: 'value': Ein automatisch generierter Parametername ist mit einem Erweiterungstypparameternamen in Konflikt.
  • CS9295: Der erweiterte Typ muss auf alle typparameter verweisen, die von der Erweiterung deklariert wurden, aber auf einen Typparameter wird nicht verwiesen.
  • CS9300: Derref Empfängerparameter eines Erweiterungsblocks muss ein Werttyp oder ein generischer Typ sein, der auf die Struktur beschränkt ist.
  • CS9301: Der Empfängerparameter "in" oder "ref readonly" der Erweiterung muss ein konkreter (nicht generischer) Werttyp sein.
  • CS9302: Neues geschütztes Mitglied, das in einem Erweiterungsblock deklariert ist.
  • CS9303: Instanzmitglieder können nicht in einem Erweiterungsblock mit einem nicht benannten Empfängerparameter deklariert werden.
  • CS9304: Init-Only-Accessoren können nicht in einem Erweiterungsblock deklariert werden.
  • CS9305: Modifizierer können nicht für den unbenannten Empfängerparameter des Erweiterungsblocks verwendet werden.
  • CS9306: Typen und Aliase können nicht "extension" genannt werden.
  • CS9309: Eine Erweiterungsmitgliedsyntax ist an einer geschachtelten Position innerhalb einer Erweiterungsmitgliedsyntax nicht zulässig.
  • CS9316: Erweiterungsmitglieder sind nicht als Argument für "nameof" zulässig.
  • CS9317: Der Parameter eines unären Operators muss der erweiterte Typ sein.
  • CS9318: Der Parametertyp für die Operatoren ++ oder -- muss der erweiterte Typ sein.
  • CS9319: Einer der Parameter eines binären Operators muss der erweiterte Typ sein.
  • CS9320: Der erste Operand eines überladenen Schichtoperators muss denselben Typ wie der erweiterte Typ aufweisen.
  • CS9321: Ein Erweiterungsblock, der eine statische Klasse erweitert, darf keine benutzerdefinierten Operatoren enthalten.
  • CS9322: Ein Instanzoperator für eine Struktur kann nicht deklariert werden, es sei denn, der Empfängerparameter des Erweiterungsblocks ist ein 'ref'-Parameter.
  • CS9323: Der Instanzerweiterungsoperator für einen Typ kann nicht deklariert werden, der nicht als Struktur bekannt ist und keine Klasse ist.
  • CS9326: 'name': Erweiterungsmemmnamen können nicht mit dem erweiterten Typ übereinstimmen.
  • CS9329: Dieser Erweiterungsblock kollidiert mit einem anderen Erweiterungsblock. Sie führen zu in Konflikt stehenden inhaltsbasierten Typnamen in Metadaten.
  • CS9339: Die Auflösung der Erweiterung ist zwischen den folgenden Mitgliedern uneindeutig.

Häufige Fehler bei Erweiterungsdeklarationen

  • CS1102: Der Parametermodifizierer 'out' kann nicht mit 'this' verwendet werden.
  • CS1103: Der erste Parameter einer Erweiterungsmethode darf nicht vom Zeigertyp sein.
  • CS1106: Erweiterungsmethoden müssen in einer nicht generischen statischen Klasse definiert werden.
  • CS1109: Erweiterungsmethoden müssen in statischen Klassen der obersten Ebene definiert werden, "name" ist eine geschachtelte Klasse.
  • CS1113: Erweiterungsmethode, die für einen Werttyp definiert ist, kann nicht zum Erstellen von Stellvertretungen verwendet werden.
  • CS1743: Der Standardwert für den Parameter "this" kann nicht angegeben werden.
  • CS9283: Erweiterungen müssen in einer nicht generischen, statischen Klasse auf oberster Ebene deklariert werden.
  • CS9284: Der Empfängerparameter einer Erweiterung darf keinen Standardwert aufweisen.
  • CS9285: Ein Erweiterungscontainer kann nur einen Empfängerparameter haben.

Der Compiler gibt diese Fehler aus, wenn Sie Regeln verletzen, die für alle Erweiterungsmemderdeklarationen gelten, unabhängig von der gewählten Syntax. Weitere Informationen finden Sie unter Erweiterungsmethoden.

Um Erweiterungsmitglieder ordnungsgemäß zu deklarieren, befolgen Sie diese Anforderungen:

  • Deklarieren Sie den enthaltenden Typ als nicht generische static Klasse oder Struktur (CS1106, CS9283).
  • Deklarieren Sie den enthaltenden Typ auf oberster Ebene, nicht in einem anderen Typ geschachtelt (CS1109, CS9283).
  • Wandeln Sie Erweiterungsmethoden für Werttypen nicht in Delegates um (CS1113). Erstellen Sie stattdessen eine reguläre Methode.
  • Verwenden Sie den out Parametermodifizierer nicht für den Empfängerparameter (CS1102).
  • Stellen Sie keine Standardwerte für den Empfängerparameter bereit (CS1743, CS9284).
  • Erweitern Sie Zeigertypen nicht (CS1103). Der Parameter, auf den Sie den this Modifizierer anwenden, kann kein Zeigertyp sein.
  • Deklarieren Sie nur einen Empfängerparameter pro Erweiterungscontainer (CS9285).
  • CS9281: Erweiterungsdeklarationen haben möglicherweise keinen Namen.
  • CS9282: Erweiterungsdeklarationen können nur Methoden oder Eigenschaften enthalten.
  • CS9287: Ein Empfängerparameter darf nicht denselben Namen wie ein Erweiterungscontainertypparameter haben.
  • CS9288: Ein Parameter, eine lokale Variable oder eine lokale Funktion kann nicht denselben Namen wie ein Parameter für den Erweiterungscontainertyp aufweisen.
  • CS9289: Der Membertypparameter hat denselben Namen wie ein Erweiterungscontainertypparameter.
  • CS9290: Ein Parameter, eine lokale Variable oder eine lokale Funktion kann nicht denselben Namen wie ein Erweiterungsparameter haben.
  • CS9291: 'value': Ein automatisch generierter Parametername ist mit einem Erweiterungsparameternamen in Konflikt.
  • CS9292: Ein Typparameter hat denselben Namen wie ein Erweiterungsparameter.
  • CS9293: In diesem Kontext kann kein Erweiterungsparameter verwendet werden.
  • CS9294: 'value': Ein automatisch generierter Parametername ist mit einem Erweiterungstypparameternamen in Konflikt.
  • CS9295: Der erweiterte Typ muss auf alle typparameter verweisen, die von der Erweiterung deklariert wurden, aber auf einen Typparameter wird nicht verwiesen.
  • CS9300: Derref Empfängerparameter eines Erweiterungsblocks muss ein Werttyp oder ein generischer Typ sein, der auf die Struktur beschränkt ist.
  • CS9301: Der Empfängerparameter "in" oder "ref readonly" der Erweiterung muss ein konkreter (nicht generischer) Werttyp sein.
  • CS9302: Neues geschütztes Mitglied, das in einem Erweiterungsblock deklariert ist.
  • CS9303: Instanzmitglieder können in einem Erweiterungsblock mit einem unbenannten Empfängerparameter nicht deklariert werden.
  • CS9304: Init-Only-Accessoren können nicht in einem Erweiterungsblock deklariert werden.
  • CS9305: Modifizierer können nicht für den unbenannten Empfängerparameter des Erweiterungsblocks verwendet werden.
  • CS9306: Typen und Aliase können nicht "extension" genannt werden.
  • CS9309: Eine Erweiterungsmember-Syntax ist in geschachtelter Position innerhalb einer Erweiterungsmember-Syntax nicht zulässig.
  • CS9316: Erweiterungsmitglieder sind nicht als Argument für "nameof" zulässig.
  • CS9317: Der Parameter eines unären Operators muss der erweiterte Typ sein.
  • CS9318: Der Parametertyp für den ++ oder -- Operator muss ein erweiterter Datentyp sein.
  • CS9319: Einer der Parameter eines binären Operators muss der erweiterte Typ sein.
  • CS9320: Der erste Operand eines überladenen Schichtoperators muss denselben Typ wie der erweiterte Typ aufweisen.
  • CS9321: Ein Erweiterungsblock, der eine statische Klasse erweitert, darf keine benutzerdefinierten Operatoren enthalten.
  • CS9322: Der Instanzoperator für eine Struktur kann nicht deklariert werden, es sei denn, der Parameter des Erweiterungsblockempfängers ist ein 'ref'-Parameter.
  • CS9323: Der Instanzerweiterungsoperator für einen Typ kann nicht deklariert werden, der nicht als Struktur bekannt ist und keine Klasse ist.
  • CS9326: 'name': Erweiterungsmemmnamen können nicht mit dem erweiterten Typ übereinstimmen.
  • CS9329: Dieser Erweiterungsblock kollidiert mit einem anderen Erweiterungsblock. Sie führen zu in Konflikt stehenden inhaltsbasierten Typnamen in Metadaten.
  • CS9339: Die Zuordnung von Erweiterungen ist für die folgenden Mitglieder nicht eindeutig.

Diese Fehler sind spezifisch für Erweiterungsblöcke, ein C#14-Feature. Erweiterungsblöcke werden mithilfe des extension Kontextschlüsselworts in einer statischen Klasse deklariert. Weitere Informationen finden Sie unter Erweiterungsmethoden.

Befolgen Sie die folgenden Anforderungen, um Erweiterungsblöcke richtig zu deklarieren:

  • Fügen Sie kein Namenstoken in die Erweiterungsdeklaration (CS9281) ein. Die Erweiterung deklariert nur den Empfänger.
  • Stellen Sie keine Standardwerte für den Empfängerparameter bereit (CS9284, die in allgemeinen Fehlern behandelt werden).
  • Verwenden Sie das extension Schlüsselwort nicht für Typen oder Aliase (CS9306). Es ist ein kontextbezogenes Schlüsselwort nur für Erweiterungsblöcke.

Um Erweiterungsmitglieder in Erweiterungsblöcken ordnungsgemäß zu deklarieren, befolgen Sie zusätzlich zu den allgemeinen Regeln die folgenden Anforderungen:

  • Fügen Sie nur Methoden oder Eigenschaften als Erweiterungselemente (CS9282) ein. Andere Membertypen werden nicht unterstützt.
  • Geben Sie einen Parameternamen für den Empfänger an, der Instanzerweiterungsmember (CS9303) enthalten soll.
  • Stellen Sie sicher, dass der Name des Empfängerparameters innerhalb des Erweiterungsblocks eindeutig ist und nicht mit Typparametern in Konflikt steht (CS9287, CS9288, CS9289, CS9290, CS9291, CS9292, CS9294).
  • Verweisen Sie auf alle Typparameter, die für die Erweiterung im erweiterten Typ deklariert sind (CS9295). Zusätzliche Typparameter können für einzelne Member hinzugefügt werden.
  • Verschachteln Sie keine Erweiterungsblöcke in anderen Erweiterungsblöcken (CS9309).
  • Verwenden Sie den ref Modifizierer für den Empfängerparameter nur mit Werttypen oder generischen Typen, die auf Struktur (CS9300) beschränkt sind.
  • Verwenden Sie den inref readonly Modifizierer für den Empfängerparameter nur mit konkreten (nicht generischen) Werttypen (CS9301).
  • Verwenden Sie keine Modifizierer für nicht benannte Empfängerparameter (CS9305).
  • Deklarieren Sie keine protected Member in Erweiterungsblöcken (CS9302). Erweiterungsmitglieder müssen zugänglich sein, wenn sich die Erweiterung im Gültigkeitsbereich befindet.
  • Deklarieren Sie keine nur init-Accessoren in Erweiterungsblöcken (CS9304). Verwenden Sie stattdessen reguläre Eigenschaftensetter.
  • Verwenden Sie Erweiterungsmitglieder nicht als Argumente für den "nameof" Operator (CS9316).
  • Wählen Sie Membernamen aus, die sich vom erweiterten Typnamen (CS9326) unterscheiden.
  • Stellen Sie sicher, dass Erweiterungsblöcke über eindeutige inhaltsbasierte Typnamen in Metadaten verfügen (CS9329). Konsolidieren oder unterscheiden Sie Erweiterungsblöcke, um Konflikte zu vermeiden.
  • Auflösen von mehrdeutigen Memberaufrufen durch Bereitstellen spezifischerer Typinformationen oder Verwenden von qualifizierten Namen (CS9339).

Anforderungen für den Erweiterungsblockoperator

Erweiterungsblöcke unterstützen benutzerdefinierte Operatoren mit bestimmten Anforderungen:

  • Unäre Operatoren müssen den erweiterten Typ als Parameter (CS9317) aufweisen.
  • Operatoren für Inkrement (++) und Decrement (--) müssen den erweiterten Typ als Parameter (CS9318) verwenden.
  • Binäre Operatoren müssen mindestens einen Parameter aufweisen, der den erweiterten Typ (CS9319) darstellt.
  • Umschaltoperatoren müssen den erweiterten Typ als ersten Operanden (CS9320) aufweisen.
  • Deklarieren Sie keine benutzerdefinierten Operatoren in Erweiterungsblöcken, die statische Klassen erweitern (CS9321).
  • Verwenden Sie beim Erweitern einer Struktur mit Instanzoperatoren den ref Modifizierer für den Empfängerparameter (CS9322).
  • Deklarieren Sie keine Instanzoperatoren für Typen, die nicht auf eine Struktur oder eine Klasse (CS9323) beschränkt sind.
  • CS1100: Die Methode weist einen Parametermodifizierer 'this' auf, der sich nicht auf dem ersten Parameter befindet.
  • CS1101: Der Parametermodifizierer 'ref' kann nicht mit 'this' verwendet werden.
  • CS1105: Erweiterungsmethoden müssen statisch sein.
  • CS1110: Eine neue Erweiterung kann nicht definiert werden, da der erforderliche Compilertyp ExtensionAttribute nicht gefunden werden kann. Fehlt ein Verweis auf System.Core.dll?
  • CS1112: Verwenden Sie nicht 'ExtensionAttribute'. Verwenden Sie stattdessen das Schlüsselwort "this".

Diese Fehler sind spezifisch für Erweiterungsmethoden, bei denen Sie den Empfänger deklarieren, indem Sie den this Modifizierer zum ersten Parameter hinzufügen. Weitere Informationen finden Sie unter Erweiterungsmethoden.

Um Parametererweiterungsmethoden ordnungsgemäß zu deklarieren this , befolgen Sie diese Anforderungen zusätzlich zu den allgemeinen Regeln:

  • Fügen Sie der Methode den static Modifizierer hinzu (CS1105).
  • Wenden Sie den this Parametermodifizierer nur auf den ersten Parameter an (CS1100).
  • Kombinieren Sie den ref Modifizierer nicht mit dem this Modifizierer (CS1101). Um ref zu verwenden, konvertieren Sie es in einen Erweiterungsblock.
  • Fügen Sie einen Verweis auf System.Core.dll in CS1110 hinzu.
  • Verwenden Sie den this Modifizierer für den ersten Parameter, anstatt das ExtensionAttribute Attribut direkt anzuwenden (CS1112).