Freigeben über


Fehler und Warnungen im Zusammenhang mit partial Typ- und partial Memberdeklarationen

Es gibt zahlreiche Fehler im Zusammenhang mit partial Typ- und partial Memberdeklarationen:

  • CS0260: Fehlender partieller Modifizierer für die Deklaration des Typs; eine weitere partielle Deklaration dieses Typs ist vorhanden.
  • CS0261: Partielle Deklarationen des Typs müssen entweder nur Klassen, nur Strukturen oder nur Schnittstellen beinhalten.
  • CS0262: Partielle Deklarationen des Typs haben Zugriffsmodifizierer, die miteinander in Konflikt stehen
  • CS0263: Partielle Deklarationen des Typs dürfen keine unterschiedlichen Basisklassen angebe.
  • CS0264: Partielle Deklarationen des Typs müssen die gleichen Typ-Parameternamen in der gleichen Reihenfolge aufweisen
  • CS0265: Partielle Deklarationen des Typs weisen inkonsistente Einschränkungen für den Typ-Parameter „type parameter“ auf
  • CS0267: Der „partial“-Modifizierer kann nur unmittelbar vor „class“, „record“, „struct', 'interface“ oder einem Methodenrückgabetyp angezeigt werden.
  • CS0282: Es gibt keine definierte Sortierung zwischen Feldern in mehreren Deklarationen der partieller Klasse oder der Struktur „type“. Um eine Sortierung anzugeben, müssen sich alle Instanzenfelder in derselben Deklaration befinden.
  • CS0501: „member function“ muss einen Text deklarieren, da sie nicht als abstract, extern oder partial markiert ist
  • CS0750: Partielle Member dürfen nicht den Modifizierer „abstract“ aufweisen.
  • CS0751: Partielle Member müssen in einem partiellen class oder einem partiellen struct deklariert werden
  • CS0754: Ein partieller Member darf keine Schnittstellenmethoden explizit implementieren.
  • CS0755: Beide partiellen Methodendeklarationen müssen Erweiterungsmethoden sein, oder keine von beiden darf eine Erweiterungsmethode sein.
  • CS0756: Eine partielle Methode darf nicht über mehrere definierende Deklarationen verfügen.
  • CS0757: Eine partielle Methode darf nicht über mehrere implementierende Deklarationen verfügen.
  • CS0759: Für die implementierende Deklaration der partiellen Methode wurde keine definierende Deklaration gefunden.
  • CS0761: Partielle Methodendeklarationen von method<T> weisen inkonsistente Typ-Parametereinschränkungen auf.
  • CS0762: Auf der Grundlage der Methode kann kein Delegat erstellt werden, da es sich um eine partielle Methode ohne implementierende Deklaration handelt
  • CS0763: Beide partiellen Methodendeklarationen müssen static sein, oder keine von beiden darf static sein.
  • CS0764: Beide partiellen Methodendeklarationen müssen unsafe sein, oder keine von beiden darf unsafe sein
  • CS1067: Partielle Deklarationen müssen die gleichen Typ-Parameternamen und Varianzmodifizierer in der gleichen Reihenfolge aufweisen.
  • CS8142: Beide partiellen Memberdeklarationen müssen dieselben Tupel-Elementnamen verwenden.
  • CS8663: Beide partiellen Memberdeklarationen müssen schreibgeschützt sein, oder keine von beiden darf schreibgeschützt sein
  • CS8796: Die partielle Methode muss über Zugriffsmodifizierer verfügen, da sie einen nicht leeren Rückgabetyp aufweist.
  • CS8795: Der partielle Member muss einen Implementierungsteil aufweisen, weil er über Zugriffsmodifizierer verfügt.
  • CS8797: Die partielle Methode muss über Zugriffsmodifizierer verfügen, da sie „out“-Parameter aufweist.
  • CS8798: Die partielle Methode muss über Zugriffsmodifizierer verfügen, da sie einen „virtual“-, „override“-, „sealed“-, „new“- oder „extern“-Modifizierer hat.
  • CS8799: Beide partiellen Memberdeklarationen müssen identische Zugriffsmodifizierer aufweisen.
  • CS8800: Beide partiellen Memberdeklarationen müssen identische Kombinationen von virtual-, override-, sealed und new-Modifizierern aufweisen.
  • CS8817: Beide partiellen Methodendeklarationen müssen den gleichen Rückgabetyp aufweisen.
  • CS8818: Partielle Memberdeklarationen müssen übereinstimmende ref Rückgabewerte aufweisen.
  • CS8863: Nur eine einzelne partielle Typ-Deklaration darf eine Parameterliste aufweisen
  • CS8988: Der scoped Modifizierer des Parameters stimmt nicht mit der partiellen Definition überein.
  • CS9248: Die partielle Eigenschaft muss über einen Implementierungsteil verfügen.
  • CS9249: Die partielle Eigenschaft muss über einen Definitionsteil verfügen.
  • CS9250: Eine partielle Eigenschaft darf nicht über mehrere definierende Deklarationen verfügen und kann keine automatische Eigenschaft sein.
  • CS9251: Eine partielle Eigenschaft darf nicht über mehrere implementierende Deklarationen verfügen
  • CS9252: Der Eigenschaftenaccessor muss implementiert sein, da er für den Definitionsteil deklariert ist
  • CS9253: Der Eigenschaftenaccessor implementiert keinen Accessor, der im Definitionsteil deklariert ist
  • CS9254: Der Eigenschaftenaccessor muss mit dem Definitionsteil übereinstimmen
  • CS9255: Beide partiellen Eigenschaftendeklarationen müssen denselben Typ aufweisen.
  • CS9256: Partielle Eigenschaftendeklarationen weisen Signaturunterschiede auf.
  • CS9257: Beide partiellen Eigenschaftendeklarationen müssen erforderlich sein, oder keine darf erforderlich sein
  • CS9258: In dieser Sprachversion bindet das Schlüsselwort "field" an ein synthetisiertes Sicherungsfeld für die Eigenschaft. Um das Generieren eines synthetisierten Sicherungsfelds zu vermeiden und stattdessen auf das vorhandene Element zu verweisen, verwenden Sie stattdessen "this.field" oder ""@field.
  • CS9263: Eine partielle Eigenschaft kann nicht sowohl für die Definition als auch für die Implementierung einen Initialisierer haben.
  • CS9275: Partielles Mitglied muss über einen Implementierungsteil verfügen.
  • CS9276: Partielles Element muss über einen Definitionsteil verfügen.
  • CS9277: Partielles Element verfügt möglicherweise nicht über mehrere definierende Deklarationen.
  • CS9278: Teilmitglied verfügt möglicherweise nicht über mehrere Implementierungsdeklarationen.
  • CS9279: Partielles Ereignis kann keinen Initialisierer haben.
  • CS9280: Nur die Implementierungsdeklaration eines Teilkonstruktors kann einen Initialisierer aufweisen.

Die folgenden Warnungen können für Feldsicherungseigenschaften generiert werden:

  • CS9264: Nicht nullable Eigenschaft muss beim Beenden des Konstruktors einen Wert ohne Null enthalten. Erwägen Sie das Hinzufügen des Modifizierers "erforderlich" oder das Deklarieren der Eigenschaft als Nullwerte oder das Hinzufügen von "[field: MaybeNull, AllowNull]"-Attributen.*
  • CS9266: Ein Accessor der Eigenschaft sollte "field" verwenden, da der andere Accessor es verwendet.
  • CS9273: In dieser Sprachversion ist "field" ein Schlüsselwort innerhalb eines Eigenschaftsaccessors. Benennen Sie die Variable um, oder verwenden Sie stattdessen den Bezeichner "@field".

In den folgenden Abschnitten werden die Ursachen und Abhilfemaßnahmen für diese Fehler und Warnungen erläutert.

Partial types (Partielle Typen)

  • CS0260: Fehlender partieller Modifizierer für die Deklaration des Typs; eine weitere partielle Deklaration dieses Typs ist vorhanden.
  • CS0261: Partielle Deklarationen des Typs müssen entweder nur Klassen, nur Strukturen oder nur Schnittstellen beinhalten.
  • CS0262: Partielle Deklarationen des Typs haben Zugriffsmodifizierer, die miteinander in Konflikt stehen
  • CS0263: Partielle Deklarationen des Typs dürfen keine unterschiedlichen Basisklassen angebe.
  • CS0264: Partielle Deklarationen des Typs müssen die gleichen Typ-Parameternamen in der gleichen Reihenfolge aufweisen
  • CS0265: Partielle Deklarationen des Typs weisen inkonsistente Einschränkungen für den Typ-Parameter „type parameter“ auf
  • CS0267: Der „partial“-Modifizierer kann nur unmittelbar vor „class“, „record“, „struct', 'interface“ oder einem Methodenrückgabetyp angezeigt werden.
  • CS8863: Nur eine einzelne partielle Typ-Deklaration darf eine Parameterliste aufweisen

Ihre partielle Typdeklaration kann dazu führen, dass der Compiler die folgende Warnung ausgibt:

  • CS0282: Es gibt keine definierte Sortierung zwischen Feldern in mehreren Deklarationen der partiellen class oder struct „Typ“. Um eine Sortierung anzugeben, müssen sich alle Instanzenfelder in derselben Deklaration befinden.

Für jeden partiellen Typ muss das partial-Schlüsselwort unmittelbar vor class, record, struct oder interface stehen. Der Compiler gibt einen Fehler aus, wenn dies in einer anderen Reihenfolge angezeigt wird. Außerdem:

  • Alle Deklarationen eines partiellen Typs müssen in Bezug auf den Typ übereinstimmen (class, struct, record class, record struct, readonly struct oder readonly record struct).
  • Alle Deklarationen müssen den partial-Modifizierer beinhalten.
  • Die Deklarationen für einen generischen partiellen Typ müssen dieselben Typ-Parameter in derselben Reihenfolge enthalten.

Einige Teile der Deklaration müssen nicht für alle Deklarationen für einen Typ wiederholt werden. Wenn diese Elemente jedoch auf mehreren partial-Deklarationen wiederholt werden, müssen sie übereinstimmen:

  • Alle Zugriffsmodifizierer, wie etwa public.
  • Alle Basisklassen- oder implementierten Schnittstellen.
  • Alle Einschränkungen für Typ-Parameter.

Ein primärer Konstruktor kann für höchstens eine Deklaration für einen partiellen Typ deklariert werden.

Der Compiler gibt eine Warnung aus, wenn mehrere Felder in mehreren Dateien für einen partial struct-Typ deklariert werden. Wenn die Layout-Reihenfolge wichtig ist, müssen Sie alle Felder in derselben Datei deklarieren. Wenn die Reihenfolge keine Rolle spielt, können Sie die System.Runtime.InteropServices.StructLayoutAttribute mit dem LayoutKind.Auto-Wert verwenden.

Partielle Member

  • CS0750: Partielle Member dürfen nicht den Modifizierer „abstract“ aufweisen.
  • CS0751: Partielle Member müssen in einem partiellen class oder einem partiellen struct deklariert werden
  • CS0754: Ein partieller Member darf keine Schnittstellenmethoden explizit implementieren.
  • CS0763: Beide partiellen Methodendeklarationen müssen static sein, oder keine von beiden darf static sein.
  • CS0764: Beide partiellen Methodendeklarationen müssen unsafe sein, oder keine von beiden darf unsafe sein
  • CS8142: Beide partiellen Memberdeklarationen müssen dieselben Tupel-Elementnamen verwenden.
  • CS8663: Beide partiellen Memberdeklarationen müssen schreibgeschützt sein, oder keine von beiden darf schreibgeschützt sein
  • CS8799: Beide partiellen Memberdeklarationen müssen identische Zugriffsmodifizierer aufweisen.
  • CS8800: Beide partiellen Memberdeklarationen müssen identische Kombinationen von virtual-, override-, sealed- und new-Modifizierern aufweisen.
  • CS8818: Partielle Memberdeklarationen müssen übereinstimmende ref-Rückgabewerte aufweisen.
  • CS8988: Der scoped Modifizierer des Parameters stimmt nicht mit der partiellen Definition überein.
  • CS9275: Partielles Mitglied muss über einen Implementierungsteil verfügen.
  • CS9276: Partielles Element muss über einen Definitionsteil verfügen.
  • CS9277: Partielles Element verfügt möglicherweise nicht über mehrere definierende Deklarationen.
  • CS9278: Teilmitglied verfügt möglicherweise nicht über mehrere Implementierungsdeklarationen.

Teilweise Mitglieder müssen zwei Erklärungen haben. Die Deklaration ohne Implementierung ist die definierende Deklaration. Die Deklaration mit der Implementierung ist die implementierende Deklaration. Beide Deklarationen sind erforderlich. Partielle Member sind nur in einem partial-Typ zulässig. Partielle Member können nicht abstract sein. Partielle Member können keine Schnittstelle explizit implementieren. Beide Deklarationen eines partiellen Members müssen identische Signaturen aufweisen. Beispielsweise können beide oder keine Deklarationen die Modifizierer static oder unsafe enthalten.

Partielle Methoden

  • CS0501: „member function“ muss einen Text deklarieren, da sie nicht als abstract, extern oder partial markiert ist
  • CS0755: Beide partiellen Methodendeklarationen müssen Erweiterungsmethoden sein, oder keine von beiden darf eine Erweiterungsmethode sein.
  • CS0756: Eine partielle Methode darf nicht über mehrere definierende Deklarationen verfügen.
  • CS0757: Eine partielle Methode darf nicht über mehrere implementierende Deklarationen verfügen.
  • CS0759: Für die implementierende Deklaration der partiellen Methode wurde keine definierende Deklaration gefunden.
  • CS0761: Partielle Methodendeklarationen von method<T> weisen inkonsistente Typ-Parametereinschränkungen auf.
  • CS0762: Auf der Grundlage der Methode kann kein Delegat erstellt werden, da es sich um eine partielle Methode ohne implementierende Deklaration handelt
  • CS1067: Partielle Deklarationen müssen die gleichen Typ-Parameternamen und Varianzmodifizierer in der gleichen Reihenfolge aufweisen.
  • CS8796: Die partielle Methode muss über Zugriffsmodifizierer verfügen, da sie einen nicht leeren Rückgabetyp aufweist.
  • CS8795: Der partielle Member muss einen Implementierungsteil aufweisen, weil er über Zugriffsmodifizierer verfügt.
  • CS8797: Die partielle Methode muss über Zugriffsmodifizierer verfügen, da sie „out“-Parameter aufweist.
  • CS8798: Die partielle Methode muss über Zugriffsmodifizierer verfügen, da sie einen „virtual“-, „override“-, „sealed“-, „new“ oder „extern“-Modifizierer hat.
  • CS8817: Beide partiellen Methodendeklarationen müssen den gleichen Rückgabetyp aufweisen.

Für bestimmte partial-Methodendeklarationen ist keine Implementierungsdeklaration erforderlich. Das heißt: Wenn das Mitglied void zurückgibt, werden keine Zugriffsmodifizierer deklariert (einschließlich des standardmäßigen private-Modifizierers), und es wird keiner der Modifizierer virtual, override, sealed oder new eingeschlossen. Andernfalls muss jede partielle Methode sowohl die deklarierende als auch die implementierende Deklaration enthalten.

Wenn eine partielle Methode eine implementierende Deklaration enthält, müssen beide Deklarationen identisch sein. Es kann genau eine implementierende Deklaration definiert werden.

CS0759 tritt auf, wenn Sie über eine implementierungsbezogene Deklaration (eine Partielle Methode mit einem Textkörper) verfügen, aber keine entsprechende definierende Deklaration (die Methodensignatur ohne Textkörper). Jede partielle Methode mit einer Implementierung muss über beide Deklarationen verfügen.

Das folgende Beispiel zeigt Code, der CS0759 generiert:

// This will cause CS0759: No defining declaration found for implementing declaration of partial method.
// Uncomment the class below to see the CS0759 error:
/*
public partial class ExampleClass
{
    // ERROR: This is an implementing declaration without a corresponding defining declaration
    partial void MyMethod() // CS0759
    {
        Console.WriteLine("Implementation without definition");
    }
}
*/

Um diesen Fehler zu beheben, fügen Sie die definierende Deklaration hinzu:

// Correct way: Provide both the defining declaration and implementing declaration
public partial class CorrectExampleClass
{
    // Defining declaration (signature without body)
    partial void MyMethod();
}

public partial class CorrectExampleClass
{
    // Implementing declaration (signature with body)
    partial void MyMethod()
    {
        Console.WriteLine("This works correctly");
    }
}

Sie können beide Deklarationen auch im gleichen Teilklassenabschnitt platzieren:

// Alternative correct approach: defining and implementing in same partial class
public partial class AlternativeExampleClass
{
    // Defining declaration
    partial void MyMethod();
    
    // Implementing declaration in same partial class section
    partial void MyMethod()
    {
        Console.WriteLine("This also works correctly");
    }
}

Partielle Eigenschaften

Die folgenden Fehler deuten auf Fehler in Ihren partiellen Eigenschafts- oder Indexerdeklarationen hin:

  • CS9248: Die partielle Eigenschaft muss über einen Implementierungsteil verfügen.
  • CS9249: Die partielle Eigenschaft muss über einen Definitionsteil verfügen.
  • CS9250: Eine partielle Eigenschaft darf nicht über mehrere definierende Deklarationen verfügen und kann keine automatische Eigenschaft sein.
  • CS9251: Eine partielle Eigenschaft darf nicht über mehrere implementierende Deklarationen verfügen
  • CS9252: Der Eigenschaftenaccessor muss implementiert sein, da er für den Definitionsteil deklariert ist
  • CS9253: Der Eigenschaftenaccessor implementiert keinen Accessor, der im Definitionsteil deklariert ist
  • CS9254: Der Eigenschaftenaccessor muss mit dem Definitionsteil übereinstimmen
  • CS9255: Beide partiellen Eigenschaftendeklarationen müssen denselben Typ aufweisen.
  • CS9257: Beide partiellen Eigenschaftendeklarationen müssen erforderlich sein, oder keine darf erforderlich sein

Die folgende Warnung weist auf einen Signaturunterschied bei der Deklarierung und Implementierung von Deklarationen in einer partiellen Eigenschaft hin:

  • CS9256: Partielle Eigenschaftendeklarationen weisen Signaturunterschiede auf.

Eine partielle Eigenschaft oder ein Indexer muss sowohl über eine deklarierende Deklaration als auch über eine implementierende Deklaration verfügen. Die Signaturen für beide Deklarationen müssen übereinstimmen. Da die deklarierende Deklaration dieselbe Syntax wie eine automatisch implementierte Eigenschaft verwendet, kann die Implementierungsdeklaration keine automatisch implementierte Eigenschaft sein. Die Accessoren müssen über mindestens einen Accessortext verfügen. Ab C# 13 können Sie das field Schlüsselwort verwenden, um einen Accessor mithilfe einer präzisen Syntax zu deklarieren:

public partial int ImplementingDeclaration { get => field; set; }

Partielle Ereignisse und Konstruktoren

  • CS9279: Partielles Ereignis kann keinen Initialisierer haben.
  • CS9280: Nur die Implementierungsdeklaration eines Teilkonstruktors kann einen Initialisierer aufweisen.

Sie haben einen Initialisierer für die definierende Deklaration eines partiellen Konstruktors oder für eine partielle Ereignisdeklaration deklariert. Sie müssen es entfernen.

feldgesicherte Eigenschaften

  • CS9258: In dieser Sprachversion bindet das Schlüsselwort "field" an ein synthetisiertes Sicherungsfeld für die Eigenschaft. Um das Generieren eines synthetisierten Sicherungsfelds zu vermeiden und stattdessen auf das vorhandene Element zu verweisen, verwenden Sie stattdessen "this.field" oder ""@field.
  • CS9263: Eine partielle Eigenschaft kann nicht sowohl für die Definition als auch für die Implementierung einen Initialisierer haben.
  • CS9264: Nicht nullable Eigenschaft muss beim Beenden des Konstruktors einen Wert ohne Null enthalten. Erwägen Sie das Hinzufügen des Modifizierers "erforderlich" oder das Deklarieren der Eigenschaft als Nullwerte oder das Hinzufügen von "[field: MaybeNull, AllowNull]"-Attributen.*
  • CS9266: Ein Accessor der Eigenschaft sollte "field" verwenden, da der andere Accessor es verwendet.
  • CS9273: In dieser Sprachversion ist "field" ein Schlüsselwort innerhalb eines Eigenschaftsaccessors. Benennen Sie die Variable um, oder verwenden Sie stattdessen den Bezeichner "@field".

Ab C# 14 field können Sie mit gesicherten Eigenschaften auf das compilersynthetisierte Sicherungsfeld für eine Eigenschaft zugreifen. CS9258 oder CS9273 geben an, dass Sie eine Variable namens fieldhaben, die durch das Kontextschlüsselwort fieldausgeblendet werden kann.

CS9263 gibt an, dass Ihre deklarierende Deklaration eine Implementierung enthält. Diese Implementierung kann auf das compilersynthetisierte Sicherungsfeld für diese Eigenschaft zugreifen. CS9264 gibt an, dass Ihre Verwendung von field ein nicht-nullbares Sicherungsfeld annimmt, während die Eigenschaftsdeklaration nullwertfähig ist. Der Compiler geht davon aus, dass sowohl das Sicherungsfeld als auch die Eigenschaft die gleiche Nullierbarkeit aufweisen. Sie müssen das [field:MaybeNull, AllowNull] Attribut der Eigenschaftsdeklaration hinzufügen, um anzugeben, dass der field Wert als Nullwerte angesehen werden soll. CS9266 gibt an, dass einer der Zugriffsmethoden einer Eigenschaft das field Schlüsselwort verwendet, die andere jedoch ein hand deklariertes Backfeld verwendet. Die Warnung weist darauf hin, dass möglicherweise ein Fehler auftritt.