Anmerkung
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen, dich anzumelden oder die Verzeichnisse zu wechseln.
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen , die Verzeichnisse zu wechseln.
Der Compiler generiert die folgenden Fehler für ungültige Deklarationen statischer abstrakter oder virtueller Member in Schnittstellen:
- CS8920: Die Schnittstelle kann nicht als Typargument verwendet werden. Statisches Mitglied verfügt nicht über eine genaueste spezifische Implementierung in der Schnittstelle.
- CS8921: Der Parameter eines unären Operators muss der enthaltende Typ oder sein Typparameter sein, der darauf beschränkt ist.
-
CS8922: Der Parametertyp für
++oder--Operator muss der enthaltende Typ oder sein Typparameter sein, der darauf beschränkt ist. -
CS8923: Der Rückgabetyp des
++- oder---Operators muss entweder mit dem Parametertyp übereinstimmen, vom Parametertyp abgeleitet sein oder ein Typparameter des enthaltenden Typs sein, der darauf beschränkt ist, es sei denn, der Parametertyp ist ein anderer Typparameter. - CS8924: Einer der Parameter eines binären Operators muss der enthaltende Typ oder sein Typparameter sein, der darauf beschränkt ist.
- CS8925: Der erste Operand eines überladenen Schichtoperators muss denselben Typ aufweisen wie der enthaltende Typ oder dessen Typparameter, der darauf beschränkt ist.
- CS8926: Auf ein statisches element für virtuelle oder abstrakte Schnittstellen kann nur für einen Typparameter zugegriffen werden.
- CS8928: Typ implementiert kein statisches Schnittstellenmemm. Die Methode kann das Schnittstellenelement nicht implementieren, da es nicht statisch ist.
- CS8930: Explizite Implementierung eines benutzerdefinierten Operators muss statisch deklariert werden.
- CS8931: Benutzerdefinierte Konvertierung in einer Schnittstelle muss in oder aus einem Typparameter für den eingeschlossenen Typ konvertiert werden, der auf den eingeschlossenen Typ beschränkt ist.
- CS8932: 'UnmanagedCallersOnly'-Methode kann kein Schnittstellenmitglied in einem Typ implementieren.
- CS9044: Der Typ implementiert kein Schnittstellenmemm. Die Methode kann kein nicht zugängliches Element implizit implementieren.
- CS9046: Einer der Parameter eines in einer Schnittstelle deklarierten Gleichheits- oder Ungleichheitsoperators muss ein Typparameter sein, der auf die Schnittstelle beschränkt ist.
Diese Fehler treten an drei Stellen in Ihrem Code auf:
- Wenn Sie eine Schnittstelle mit statischen abstrakten oder virtuellen Membern deklarieren,
- Wenn Sie einen Typ deklarieren, der eine Schnittstelle mit statischen abstrakten oder virtuellen Membern implementiert, und
- Wenn Sie auf eine statische abstrakte oder virtuelle Methode zugreifen, die in einer Schnittstelle deklariert ist.
Fehler in der Schnittstellendeklaration
Möglicherweise treten die folgenden Fehler auf, wenn Sie eine Schnittstelle mit static abstract oder static virtual Member deklarieren:
- CS8921: Der Parameter eines unären Operators muss der enthaltende Typ oder sein Typparameter sein, der darauf beschränkt ist.
-
CS8922: Der Parametertyp für
++oder--Operator muss der enthaltende Typ oder sein Typparameter sein, der darauf beschränkt ist. -
CS8923: Der Rückgabetyp für den Operator
++oder--muss entweder mit dem Parametertyp übereinstimmen, oder vom Parametertyp abgeleitet sein, oder der Typparameter des enthaltenden Typs, der darauf beschränkt ist, es sei denn, der Parametertyp ist ein anderer Typparameter. - CS8924: Einer der Parameter eines binären Operators muss der enthaltende Typ oder sein Typparameter sein, der darauf beschränkt ist.
- CS8925: Der erste Operand eines überladenen Schichtoperators muss denselben Typ aufweisen wie der enthaltende Typ oder dessen Typparameter, der darauf beschränkt ist.
- CS8931: Benutzerdefinierte Konvertierung in einer Schnittstelle muss in oder aus einem Typparameter für den eingeschlossenen Typ konvertiert werden, der auf den eingeschlossenen Typ beschränkt ist.
- CS9046: Einer der Parameter eines in der Schnittstelle deklarierten Gleichheits- oder Ungleichheitsoperators muss ein Typparameter sein, der auf die Schnittstelle beschränkt ist.
Stellen Sie für in einer Schnittstelle deklarierte unäre Operatoren sicher, dass der Parameter entweder der Schnittstellentyp selbst oder ein Typparameter T ist, der T auf die Implementierung der Schnittstelle (CS8921) beschränkt ist. Diese Einschränkung stellt sicher, dass der Operator nur auf Typen angewendet werden kann, die die Schnittstelle implementieren, sodass der Compiler die richtige Implementierung zur Kompilierungszeit auflösen kann.
Überprüfen Sie bei Operatoren für Inkrementierung (++) und Decrement (--), dass der Parameter die gleichen Regeln wie andere unäre Operatoren (CS8922) befolgt. Darüber hinaus muss der Rückgabetyp entweder mit dem Parametertyp übereinstimmen, ihn ableiten oder der Typparameter der Schnittstelle sein, der auf die Schnittstelle beschränkt ist (CS8923). Diese Regeln stellen sicher, dass Inkrementierungs- und Dekrementvorgänge einen kompatiblen Typ zurückgeben, der der ursprünglichen Variablen zurück zugewiesen werden kann.
Bei binären Operatoren muss mindestens einer der beiden Parameter der enthaltende Schnittstellentyp oder ein Typparameter sein, der auf die Implementierung der Schnittstelle (CS8924) beschränkt ist. Mit dieser Anforderung kann der andere Parameter ein beliebiger Typ sein, sodass Operatoren wie T operator +(T left, int right) in generischen mathematischen Szenarien aktiviert werden.
Bei Umschaltoperatoren (<< und >>) muss der erste Operand der enthaltende Typ oder sein eingeschränkter Typparameter (CS8925) sein. Der zweite Operand folgt standardmäßigen Umschaltoperatorregeln und ist in der Regel int.
Bei benutzerdefinierten Konvertierungsoperatoren muss die Konvertierung einen Typparameter umfassen, der auf den eingeschlossenen Schnittstellentyp (CS8931) beschränkt ist. Konvertierungen zwischen beliebigen Typen in einer Schnittstelle können nicht definiert werden. die Konvertierung muss sich auf Typen beziehen, die die Schnittstelle implementieren.
Bei Gleichheitsoperatoren (==) und Ungleichheiten (!=) muss mindestens ein Parameter ein Typparameter sein, der auf die Schnittstelle beschränkt ist, nicht nur der Schnittstellentyp selbst (CS9046). Diese strengere Anforderung für Gleichheitsoperatoren stellt beim Vergleichen von Instanzen über die Schnittstelle eine ordnungsgemäße Typsicherheit sicher.
Weitere Informationen zu den Regeln für Operatordeklarationen in Schnittstellen finden Sie in statischen abstrakten Membern in Schnittstellen. Eine praktische Anleitung zur Implementierung dieser Muster finden Sie unter "Erkunden statischer abstrakter Schnittstellenmember".
Fehler bei der Typimpl implementierenden Schnittstellendeklaration
Beim Definieren eines Typs, der eine Schnittstelle mit static abstract oder static virtual Methoden implementiert, treten möglicherweise die folgenden Fehler auf:
- CS8928: Typ implementiert kein statisches Schnittstellenmemm. Die Methode kann das Schnittstellenelement nicht implementieren, da es nicht statisch ist.
- CS8930: Explizite Implementierung eines benutzerdefinierten Operators muss statisch deklariert werden.
- CS8932: 'UnmanagedCallersOnly'-Methode kann Schnittstellenmitglied in Typ nicht implementieren.
- CS9044: Der Typ implementiert kein Schnittstellenmemm. Die Methode kann kein nicht zugängliches Element implizit implementieren.
Wenn Sie ein statisches abstraktes oder statisches Element für virtuelle Schnittstellen implementieren, deklarieren Sie die Implementierungsmethode mithilfe des static Modifizierers (CS8928). Im Gegensatz zu Instanzschnittstellenmelementen, die von Instanzmethoden implementiert werden, benötigen statische abstrakte Member statische Implementierungen, da die Laufzeit sie für den Typ selbst aufruft, nicht für eine Instanz.
Fügen Sie für explizite Implementierungen von benutzerdefinierten Operatoren über eine Schnittstelle den static Modifizierer in die Implementierung (CS8930) ein. Explizite Schnittstellenimplementierungen von Operatoren folgen der gleichen statischen Anforderung wie implizite Implementierungen.
Entfernen Sie das System.Runtime.InteropServices.UnmanagedCallersOnlyAttribute Attribut aus einer beliebigen Methode, die ein Schnittstellenelement implementiert (CS8932). Methoden, die mit diesem Attribut gekennzeichnet sind, können nur aus nicht verwalteten Code aufgerufen werden und können nicht an der Schnittstellenimplementierung teilnehmen, da die Laufzeit sie über den Schnittstellenweiterleitungsmechanismus aufrufen muss.
Wenn die Implementierungsmethode restriktivere Zugänglichkeit als das Schnittstellenelement aufweist (z. B. eine private- oder internal-Methode, die ein public-Schnittstellenelement implementiert), verwenden Sie eine explizite Implementierungssyntax anstelle der impliziten Implementierung (CS9044). Die implizite Implementierung erfordert, dass das implementierende Mitglied mindestens so barrierefrei ist wie das von ihr implementierte Schnittstellenelement.
Weitere Informationen zum Implementieren von Schnittstellenmbern finden Sie unter Schnittstellen und explizite Schnittstellenimplementierung.
Fehler beim Aufrufen statischer abstrakter Schnittstellenmitglieder
Möglicherweise werden die folgenden Fehler angezeigt, wenn Sie versuchen, ein Element aufzurufen, das als Ein static abstract - oder static virtual Mitglied einer Schnittstelle definiert ist:
- CS8920: Die Schnittstelle kann nicht als Typargument verwendet werden. Ein statisches Mitglied hat keine genau definierte Implementierung in der Schnittstelle.
- CS8926: Auf ein statisches element für virtuelle oder abstrakte Schnittstellen kann nur für einen Typparameter zugegriffen werden.
Wenn Sie eine Schnittstelle mit statischen abstrakten Membern als Typargument verwenden, stellen Sie sicher, dass alle statischen abstrakten Member über eine spezifische Implementierung verfügen (CS8920). Dieser Fehler wird angezeigt, wenn der Compiler nicht bestimmen kann, welche Implementierung verwendet werden soll. Dies liegt in der Regel daran, dass mehrere Schnittstellenhierarchien widersprüchliche Standardimplementierungen bereitstellen oder keine Implementierung vorhanden ist.
Greifen Sie auf statische abstrakte oder statische elemente der virtuellen Schnittstelle über einen Typparameter zu, der auf die Implementierung der Schnittstelle beschränkt ist, anstatt direkt über den Schnittstellentyp (CS8926). Verwenden Sie T.MemberName dort, wo T durch where T : IMyInterface eingeschränkt ist, anstatt IMyInterface.MemberName. Der Compiler benötigt einen konkreten Typ, um zu lösen, welche Implementierung aufgerufen werden soll, und ein eingeschränkter Typparameter stellt diesen konkreten Typ zur Kompilierungszeit durch generische Spezialisierung bereit.
Weitere Informationen zum Zugreifen auf statische abstrakte Member finden Sie unter statische abstrakte Member in Schnittstellen.