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:
- CS0071: Eine explizite Schnittstellenimplementierung eines Ereignisses muss die Syntax des Ereignisaccessors verwenden.
- CS0106: Der Modifizierer ist für dieses Element ungültig.
- CS0277: Das Mitglied implementiert kein Schnittstellenmitglied, da es nicht öffentlich ist.
- CS0425: Die Einschränkungen für den Typparameter der Methode müssen mit den Einschränkungen für den Typparameter der Schnittstellenmethode übereinstimmen. Erwägen Sie stattdessen die Verwendung einer expliziten Schnittstellenimplementierung.
- CS0460: Einschränkungen für Außerkraftsetzung und explizite Schnittstellenimplementierungsmethoden werden von der Basismethode geerbt, sodass sie nicht direkt angegeben werden können, mit Ausnahme einer "Klasse" oder einer "Struktur"-Einschränkung.
- CS0470: Die Methode kann keinen Schnittstellenaccessor für den Typ implementieren. Verwenden Sie eine explizite Schnittstellenimplementierung.
- CS0473: Explizite Schnittstellenimplementierung "Methodenname" entspricht mehr als einem Schnittstellenmitglied. Welches Schnittstellenelement tatsächlich ausgewählt wird, ist von der Implementierung abhängig. Erwägen Sie an Stelle dessen die Verwendung einer nicht expliziten Implementierung.
- CS0531: Schnittstellenmitglieder können keine Definition haben.
- CS0535: Member implementiert kein Schnittstellenmitglied.
- CS0538: Ein Mitglied in der expliziten Schnittstellendeklaration ist keine Schnittstelle.
- CS0539: Ein Mitglied in der expliziten Schnittstellendeklaration wurde nicht unter den Mitgliedern der Schnittstelle gefunden, die implementiert werden können.
- CS0540: Der enthaltende Typ implementiert kein Schnittstellenmemm.
- CS0541: Explizite Schnittstellendeklaration kann nur in einer Klasse, einem Datensatz, einer Struktur oder einer Schnittstelle deklariert werden.
- CS0550: Member fügt einen Accessor hinzu, der im Schnittstellenelement nicht gefunden wurde.
- CS0551: Bei der expliziten Schnittstellenimplementierung fehlt ein Accessor.
- CS0630: Member kann kein Schnittstellenmitglied implementieren, da er über einen __arglist-Parameter verfügt.
- CS0686: Accessor kann kein Schnittstellenmememm implementieren. Verwenden Sie eine explizite Schnittstellenimplementierung.
- CS0736: Member implementiert kein Instanzschnittstellenmemm. Das Schnittstellenelement kann nicht implementiert werden, da es statisch ist.
- CS0737: Member implementiert kein Schnittstellenmitglied. Es kann kein Schnittstellenmitglied implementieren, da es nicht öffentlich ist.
- CS0738: Mitglied implementiert kein Schnittstellenmitglied. Dies ist nicht möglich, da es nicht über den passenden Rückgabetyp verfügt.
- CS8705: Das Schnittstellenmitglied verfügt nicht über die spezifischste Implementierung. Keines der Mitglieder ist das spezifischste.
- CS8854: Member implementiert kein Schnittstellenmitglied.
- CS9333: Der Parametertyp muss mit dem implementierten Member übereinstimmen.
- CS9334: Der Rückgabetyp muss mit dem implementierten Mitglied übereinstimmen.
Schnittstellendeklaration und Syntax
Die folgenden Fehler beziehen sich auf die richtige Syntax und Struktur beim Deklarieren expliziter Schnittstellenimplementierungen:
- CS0071: Eine explizite Schnittstellenimplementierung eines Ereignisses muss die Syntax des Ereignisaccessors verwenden.
- CS0106: Der Modifizierer ist für dieses Element ungültig.
- CS0531: Schnittstellenmitglieder dürfen keine Definition haben.
- CS0538: Member in expliziter Schnittstellendeklaration ist keine Schnittstelle.
- CS0541: Explizite Schnittstellendeklaration kann nur in einer Klasse, einem Datensatz, einer Struktur oder einer Schnittstelle deklariert werden.
Sie können diese Fehler mit den folgenden Techniken beheben:
- Sie müssen manuell
addundremoveAccessoren bereitstellen, wenn Sie ein Schnittstellenereignis explizit implementieren (CS0071). Der Compiler generiert diese Accessoren nicht automatisch für explizite Schnittstellenimplementierungen. Daher müssen Sie sie explizit definieren, um anzugeben, wie das Ereignis gespeichert und verwaltet wird. - Entfernen Sie den
publicModifizierer aus expliziten Schnittstellenimplementierungen (CS0106). Explizite Schnittstellenimplementierungen sind implizit öffentlich, wenn über den Schnittstellentyp zugegriffen wird, wodurch daspublicSchlüsselwort redundant und in diesem Kontext nicht zulässig ist. - Entfernen Sie den
abstractModifizierer aus expliziten Schnittstellenimplementierungen (CS0106). Explizite Schnittstellenimplementierungen stellen die tatsächliche Implementierung bereit und können nicht als abstrakt gekennzeichnet werden, da sie in abgeleiteten Klassen nicht überschrieben werden können. - Entfernen Sie den Methodentext aus Schnittstellenmememagen, oder verschieben Sie die Implementierung in eine Klasse oder Struktur, die die Schnittstelle implementiert (CS0531). Vor C# 8.0 durften Schnittstellenmitglieder keine Implementierungen enthalten; ab C# 8.0 können Sie Standardschnittstellenmethoden mithilfe bestimmter Syntax bereitstellen.
- Stellen Sie sicher, dass der in der expliziten Schnittstellendeklaration angegebene Typ ein tatsächlicher Schnittstellentyp (CS0538) ist. Nur Schnittstellentypen können in expliziter Schnittstellenimplementierungssyntax verwendet werden; Der Versuch, eine Klasse oder einen anderen Nicht-Schnittstellentyp zu verwenden, verstößt gegen die expliziten Implementierungsregeln.
- Verschieben Sie explizite Schnittstellendeklarationen in eine Klasse oder Struktur, die die Schnittstelle in der Basisliste (CS0541) deklariert. Explizite Schnittstellenimplementierungen müssen im Textkörper einer Klasse oder eines Strukturtyps angezeigt werden und können nicht auf Namespaceebene oder in anderen Kontexten deklariert werden.
Weitere Informationen finden Sie unter Schnittstellen, explizite Schnittstellenimplementierung und Implementierung von Schnittstellenereignissen.
Rückgabetypen und Signaturen
Die folgenden Fehler treten auf, wenn die Signatur der Methode nicht mit der Schnittstellenmitgliedsdeklaration übereinstimmt:
- CS0738: Mitglied implementiert kein Schnittstellenmitglied. Dies ist nicht möglich, da es nicht den passenden Rückgabetyp hat.
- CS8854: Mitglied implementiert kein Schnittstellenmitglied.
- CS9333: Der Parametertyp muss mit dem implementierten Member übereinstimmen.
- CS9334: Der Rückgabetyp muss mit dem implementierten Mitglied übereinstimmen.
Sie können diese Fehler mit den folgenden Techniken beheben:
- Ändern Sie den Rückgabetyp der Implementierungsmethode so, dass er genau mit dem rückgabetyp übereinstimmt, der im Schnittstellenmemm (CS0738, CS9334) deklariert ist. Die Signatur der Implementierung muss genau mit der Schnittstellendeklaration übereinstimmen, da die Methodensignatur Teil des Vertrags ist, der bestimmt, welches Schnittstellenelement implementiert wird.
- Stellen Sie sicher, dass Parametertypen in der Implementierungsmethode genau mit den parametertypen übereinstimmen, die im Schnittstellenmemm (CS9333) deklariert sind. Jeder Parameter muss den gleichen Typ an derselben Position aufweisen wie in der Schnittstellendeklaration angegeben, da Parametertypen grundlegende Komponenten der Methodensignatur sind, die der Compiler verwendet, um Implementierungen an Schnittstellenmmber abzugleichen.
- Fügen Sie der implementierenden Eigenschaft einen
initAccessor hinzu, wenn die Schnittstelleneigenschaft eineninitSetter (CS8854) deklariert. DasinitSchlüsselwort ermöglicht die Eigenschaftsinitialisierung während der Objektkonstruktion, während eine nachträgliche Änderung verhindert wird, und die implementierende Eigenschaft muss dasselbe Initialisierungsverhalten bereitstellen, um den Schnittstellenvertrag zu erfüllen.
Weitere Informationen finden Sie unter Schnittstellen, Eigenschaften und Nur-Init-Setter.
Fehlende oder unvollständige Implementierungen
Die folgenden Fehler treten auf, wenn eine Klasse keine Schnittstelle vollständig implementiert oder Member implementiert, die nicht mit dem Schnittstellenvertrag übereinstimmen:
- CS0535: Member implementiert kein Schnittstellenmitglied.
- CS0550: Member fügt einen Accessor hinzu, der im Schnittstellenelement nicht gefunden wurde.
- CS0551: Explizite Schnittstellenimplementierung fehlt ein Accessor.
Sie können diese Fehler mit den folgenden Techniken beheben:
- Stellen Sie eine Implementierung für jedes Element bereit, das in der Schnittstelle deklariert ist, oder deklarieren Sie den Typ als
abstract(CS0535). Jedes Mitglied muss implementiert werden, um die Schnittstellenanforderungen zu erfüllen. - Entfernen Sie alle Accessoren aus der implementierenden Eigenschaft, die nicht in der Schnittstelleneigenschaft (CS0550) deklariert sind. Die implementierende Eigenschaft kann nur die in der Schnittstellendefinition explizit deklarierten Accessoren enthalten, wodurch sichergestellt wird, dass die Implementierung keine Funktionalität über das angibt, was der Schnittstellenvertrag angibt.
- Fügen Sie der expliziten Schnittstellenimplementierung alle erforderlichen Accessoren hinzu, um der Schnittstellendeklaration (CS0551) zu entsprechen. Jeder in der Schnittstelle deklarierte Accessor muss über einen entsprechenden Accessor in der Implementierung mit übereinstimmenden Signaturen verfügen, da die Implementierung den vollständigen Accessor-Vertrag erfüllen muss, der von der Schnittstelle definiert ist.
Weitere Informationen finden Sie unter Schnittstellen und Eigenschaften.
Mitgliederabgleich und Auslösung
Die folgenden Fehler treten auf, wenn Sie versuchen, Schnittstellenmber zu implementieren, die nicht in der Schnittstelle vorhanden sind oder wenn der enthaltende Typ die Schnittstelle nicht deklariert:
- CS0539: Mitglied in expliziter Schnittstellendeklaration gehört nicht zu den Mitgliedern der Schnittstelle, die implementiert werden können.
- CS0540: Der enthaltende Typ implementiert kein Schnittstellenmitglied.
Sie können diese Fehler mit den folgenden Techniken beheben:
- Stellen Sie sicher, dass der Membername und die Signatur in der expliziten Schnittstellenimplementierung genau mit einem mitglied übereinstimmen, das in der Schnittstelle deklariert ist, oder entfernen Sie die falsche Implementierung (CS0539). Das Element, das Sie implementieren möchten, muss tatsächlich in der Schnittstellendefinition mit übereinstimmendem Namen, Rückgabetyp und Parametertypen vorhanden sein, da die explizite Schnittstellenimplementierung präzise Übereinstimmung mit dem Schnittstellenvertrag erfordert.
- Fügen Sie die Schnittstelle zur Basisliste der Klasse oder Struktur hinzu, oder entfernen Sie die explizite Schnittstellenimplementierung (CS0540). Ein Typ kann nur Elemente von Schnittstellen explizit implementieren, die er in der Vererbungsliste deklariert, sodass der implementierungstyp die Schnittstellenbeziehung einrichten muss, bevor er explizite Implementierungen bereitstellen kann.
Weitere Informationen finden Sie unter Schnittstellen und explizite Schnittstellenimplementierung.
Generische Typeneinschränkungen
Die folgenden Fehler treten bei der Implementierung generischer Schnittstellenmethoden mit Typparametereinschränkungen auf:
- CS0425: Die Einschränkungen für den Typparameter der Methode müssen mit den Einschränkungen für den Typparameter der Schnittstellenmethode übereinstimmen. Erwägen Sie stattdessen die Verwendung einer expliziten Schnittstellenimplementierung.
- CS0460: Einschränkungen für Außerkraftsetzung und explizite Schnittstellenimplementierungsmethoden werden von der Basismethode geerbt, sodass sie nicht direkt angegeben werden können, mit Ausnahme einer "Klasse" oder einer "Struktur"-Einschränkung.
Sie können diese Fehler mit den folgenden Techniken beheben:
- Stellen Sie sicher, dass die
whereKlausel in der Implementierungsmethode mit der Schnittstellenmethodendeklaration identisch ist oder mit der semantischen Bedeutung der Einschränkungen (CS0425) übereinstimmt. Die Typparametereinschränkungen in der Implementierung müssen mit denen übereinstimmen, die in der Schnittstelle oder Basismethode definiert sind. - Entfernen Sie explizite Einschränkungsdeklarationen aus Außerkraftsetzungs- und expliziten Schnittstellenimplementierungsmethoden (CS0460). Die Außerkraftsetzungsmethode erbt ihre Einschränkungen automatisch von der Basis- oder Schnittstellenmethode, sodass die Neudeklaration redundant ist und nicht zulässig ist, außer für bestimmte Fälle, die in C# 8 und höher zulässig sind.
- Verwenden Sie die
defaultEinschränkung, um Mehrdeutigkeiten bei nullfähigen Referenztypen in Überschreibungen und expliziten Schnittstellenimplementierungen zu lösen, wenn Sie C# 9 oder höher verwenden (CS0460). Mit dieser Ausnahme der Einschränkungsvererbungsregel können Sie explizit die Standardeinschränkung angeben, um mehrdeutige Kontexte von Nullable-Anmerkungen zu klären. - Geben Sie explizit
where T : class- oderwhere T : struct-Einschränkungen für Methoden zur Außerkraftsetzung und expliziten Schnittstellenimplementierung an, wenn Sie C# 8 oder höher verwenden, um Anmerkungen für nullable Verweistypen (CS0460) zu aktivieren. Diese spezifischen Einschränkungen sind erlaubt, um die Analyse von Nullable-Referenztypen bei Typparametern zu unterstützen, die auf Referenz- oder Werttypen beschränkt sind.
Weitere Informationen finden Sie unter Einschränkungen für Typparameter, Schnittstellen und Nullwerte für Referenztypen.
Methodensichtbarkeit und Modifikatoren
Die folgenden Fehler treten bei der Implementierung von Schnittstellenmethoden mit falschen Barrierefreiheits- oder Modifizierern auf:
- CS0736: Member implementiert kein Instanzschnittstellenmemm. Das Schnittstellenelement kann nicht implementiert werden, da es statisch ist.
- CS0737: Member implementiert kein Schnittstellenmitglied. Ein Schnittstellenelement kann nicht implementiert werden, da es nicht öffentlich ist.
Sie können diese Fehler mit den folgenden Techniken beheben:
- Entfernen Sie den
staticModifizierer aus der Methodendeklaration, die das Schnittstellenelement (CS0736) implementiert. Vor C# 10 sind Schnittstellenmitglieder Instanzmitglieder, nicht statische Member. - Fügen Sie der Methode, die das Schnittstellenelement (
public) implementiert, den Zugriffsmodifizierer hinzu. Alle Schnittstellenmitglieder sind implizitpublic, da Schnittstellen einen Vertrag für öffentliches Verhalten definieren. Daher muss die Implementierungsmethode auch öffentlich zugänglich sein, um über die Schnittstellenreferenz darauf zugreifen zu können.
Weitere Informationen finden Sie unter Schnittstellen und Zugriffsmodifizierer.
Implementierung von Accessoren und Konflikte
Bei der Implementierung von Schnittstelleneigenschaften oder Ereignissen mit Accessormethoden mit Sichtbarkeitsproblemen oder Namenskonflikten treten die folgenden Fehler auf:
- CS0277: Das Mitglied implementiert kein Schnittstellenmitglied, da es nicht public ist.
- CS0470: Die Methode kann keinen Schnittstellenaccessor für den Typ implementieren. Verwenden Sie eine explizite Schnittstellenimplementierung.
- CS0686: Accessor kann kein Schnittstellenmitglied implementieren. Verwenden Sie eine explizite Schnittstellenimplementierung.
Sie können diese Fehler mit den folgenden Techniken beheben:
- Entfernen Sie alle Zugriffsmodifizierer aus Eigenschafts-Accessoren, die die Sichtbarkeit auf weniger sichtbar als
publicbeschränken, oder fügen Sie denpublicModifizierer hinzu, wenn er fehlt (CS0277). Alle Schnittstellenmitglieder sind implizitpublic, sodass der implementierende Accessor auch über öffentliche Zugänglichkeit verfügen muss, um den Schnittstellenvertrag zu erfüllen und über den Schnittstellentyp zugänglich zu sein. - Ersetzen Sie Methoden mit Namen, die einem Accessor ähneln (z. B.,
get_PropertyName), durch die richtige Eigenschaftensyntax unter Verwendung der expliziten Schnittstellenimplementierung (CS0470). Der Compiler generiert Accessormethoden intern für Eigenschaften, und der Versuch, Methoden mit diesen reservierten Namen manuell zu erstellen, führt zu Konflikten mit dem Implementierungsmechanismus der Eigenschaft. - Verwenden Sie explizite Syntax der Schnittstellenimplementierung, um Namenskonflikte zu beheben, wenn die Schnittstelle Methodennamen enthält, die den automatisch generierten Accessormethoden (CS0686) entsprechen. Der Compiler generiert automatisch Methoden wie
get_Propertyundset_Propertyfür Eigenschaften sowieadd_Eventremove_Eventfür Ereignisse. Wenn eine Schnittstelle Methoden mit diesen genauen Namen deklariert, ist eine explizite Implementierung erforderlich, um zwischen der Schnittstellenmethode und dem vom Compiler generierten Accessor eindeutig zu unterscheiden.
Weitere Informationen finden Sie unter Schnittstellen, Eigenschaften und Ereignisse.
Mehrdeutige und widersprüchliche Implementierungen
Die folgenden Fehler treten auf, wenn der Compiler nicht bestimmen kann, welche Schnittstellenimplementierung verwendet werden soll:
- CS0473: Die explizite Schnittstellenimplementierung "Methodenname" entspricht mehr als einem Schnittstellenelement. Welches Schnittstellenelement tatsächlich ausgewählt wird, hängt von der Implementierung ab. Erwägen Sie stattdessen die Verwendung einer impliziten Implementierung.
- CS8705: Das Schnittstellenmitglied "member" hat keine am spezifischsten festgelegte Implementierung. Keine davon ist am spezifischsten.
Sie können diese Fehler mit den folgenden Techniken beheben:
- Entfernen Sie die explizite Schnittstellenimplementierung, und verwenden Sie stattdessen eine einzelne implizite öffentliche Implementierung für beide Schnittstellenmethoden (CS0473). Wenn eine generische Methode dieselbe Signatur wie eine nicht generische Methode hat (z. B. bei der Implementierung von
ITest<int>, woTestMethod(int)undTestMethod(T)identisch werden), kann das Metadatensystem der Common Language-Infrastruktur nicht eindeutig bestimmen, welches Schnittstellenmitglied an welchen Implementierungsplatz gebunden wird, weshalb durch die Verwendung einer impliziten Implementierung die einzelne Methode beide Schnittstellenanforderungen erfüllen kann. - Stellen Sie eine explizite Implementierung in der implementierenden Klasse oder Struktur bereit, die die Mehrdeutigkeit zwischen mehreren Standardimplementierungen (CS8705) auflöst. Dieser Fehler tritt in der Regel bei Rautenvererbungsmustern auf, bei denen eine Klasse mehrere Schnittstellen implementiert, die jeweils Standardimplementierungen für dasselbe Element bereitstellen. Sie müssen dem Compiler explizit angeben, welche Implementierung verwendet werden soll, oder Ihre eigene Implementierung bereitstellen.
- Überarbeiten Sie die Schnittstellenhierarchie, um Diamantvererbungskonflikte zu vermeiden, bei denen mehrere Schnittstellen Standardimplementierungen für dasselbe Element (CS8705) bereitstellen. Indem Sie die Schnittstellenbeziehungen neu entwerfen oder die Standardimplementierungen in einer einzigen Schnittstelle konsolidieren, können Sie die Mehrdeutigkeit beseitigen, die verhindert, dass der Compiler die spezifischste Implementierung bestimmt.
Weitere Informationen finden Sie unter Schnittstellen und Standardschnittstellenmethoden.
Besondere Implementierungseinschränkungen
Der folgende Fehler tritt auf, wenn spezielle Parametertypen verwendet werden, die nicht mit der Schnittstellenimplementierung kompatibel sind:
- CS0630: Member kann kein Schnittstellenmitglied implementieren, weil es einen __arglist-Parameter hat.
Sie können diesen Fehler mit den folgenden Techniken beheben:
- Entfernen Sie den
__arglistParameter aus der Implementierungsmethode (CS0630). Mit dem__arglistSchlüsselwort können Methoden variable Anzahl von Argumenten auf nicht verwaltete Weise akzeptieren, dieses Feature ist jedoch nicht mit der Schnittstellenimplementierung kompatibel, da Schnittstellenverträge vorhersagbare, typsichere Signaturen erfordern, die zur Kompilierungszeit überprüft werden können. - Ersetzen Sie den
__arglistParameter durch einenparamsArrayparameter für Argumentlisten mit variabler Länge (CS0630). Im Gegensatz dazu__argliststellt dasparamsSchlüsselwort einen typsicheren Mechanismus zum Akzeptieren variabler Anzahl von Argumenten bereit, die vollständig mit der Schnittstellenimplementierung kompatibel sind, und verwaltet die Sicherheit des Kompilierungszeittyps, die Schnittstellen erfordern.
Weitere Informationen finden Sie unter Schnittstellen und Params-Schlüsselwort.