Freigeben über


Fehler und Warnungen bei statischen abstrakten und virtuellen Membern in Schnittstellen

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. Der statische Member verfügt nicht über eine spezifische Implementierung in der Schnittstelle.
  • CS8921: Ein Parameter eines unären Operators muss der enthaltende Typ sein oder sein zugehöriger Typparameter, der darauf beschränkt ist.
  • CS8922: Ein Parameter eines ++- oder ---Operators muss der enthaltende Typ sein oder sein zugehöriger Typparameter, der darauf beschränkt ist.
  • CS8923: Der Rückgabetyp für den ++- oder ---Operator muss entweder mit dem Parametertyp übereinstimmen, vom Parametertyp abgeleitet werden oder der Typparameter des enthaltenden Typs sein, der beschränkt ist, sofern der Parametertyp kein anderer Typparameter ist.
  • CS8924: Einer der Parameter eines binären Operators muss der enthaltende Typ sein oder sein zugehöriger Typparameter, der darauf beschränkt ist.
  • CS8925: Der erste Operand eines überladenen Shift-Operators muss denselben Typ wie der enthaltende Typ aufweisen, oder seinen Typparameter aufweisen, der darauf beschränkt ist.
  • CS8926: Auf einen statischen virtuellen oder abstrakten Schnittstellenmember kann nur über einen Typparameter zugegriffen werden.
  • CS8928: Der Typ implementiert kein Member der statischen Schnittstelle. Die Methode kann den Schnittstellenmember nicht implementieren, da er nicht statisch ist.
  • CS8930: Die explizite Implementierung eines benutzerdefinierten Operators muss statisch deklariert werden.
  • CS8931: Die benutzerdefinierte Konvertierung in einer Schnittstelle muss in einen oder von einem Typparameter für den einschließenden Typ, der auf den einschließenden Typ beschränkt ist, konvertieren.
  • CS8932: Die Methode „UnmanagedCallersOnly“ kann den Schnittstellenmember im Typ nicht implementieren.

Diese Fehler treten an drei Stellen in Ihrem Code auf:

Fehler in der Schnittstellendeklaration

Die folgenden Fehler können auftreten, wenn Sie eine Schnittstelle mit static abstract- oder static virtual-Membern deklarieren:

  • CS8921: Ein Parameter eines unären Operators muss der enthaltende Typ sein oder sein zugehöriger Typparameter, der darauf beschränkt ist.
  • CS8922: Ein Parameter eines ++- oder ---Operators muss der enthaltende Typ sein oder sein zugehöriger Typparameter, der darauf beschränkt ist.
  • CS8923: Der Rückgabetyp für den ++- oder ---Operator muss entweder mit dem Parametertyp übereinstimmen, vom Parametertyp abgeleitet werden oder der Typparameter des enthaltenden Typs sein, der beschränkt ist, sofern der Parametertyp kein anderer Typparameter ist.
  • CS8924: Einer der Parameter eines binären Operators muss der enthaltende Typ sein oder sein zugehöriger Typparameter, der darauf beschränkt ist.
  • CS8925: Der erste Operand eines überladenen Shift-Operators muss denselben Typ wie der enthaltende Typ aufweisen, oder seinen Typparameter aufweisen, der darauf beschränkt ist.
  • CS8931: Die benutzerdefinierte Konvertierung in einer Schnittstelle muss in einen oder von einem Typparameter für den einschließenden Typ, der auf den einschließenden Typ beschränkt ist, konvertieren.

Alle diese Regeln sind Erweiterungen der Regeln zum Deklarieren überladener Operatoren. Der Unterschied besteht darin, dass der Parameter entweder der Schnittstellentyp oder der Typparameter der Schnittstelle sein kann, wenn dieser Typparameter darauf beschränkt ist, die Schnittstelle für seinen Typ zu implementieren. Bei binären Operatoren muss nur ein Parameter diese Regel erfüllen.

Zum Beispiel kann INumber<T> einen T operator++(T) deklarieren, weil T gezwungen ist, INumber<T> zu implementieren.

Um diese Fehler zu beheben, stellen Sie sicher, dass die Parameter aller in der Schnittstelle definierten Operatoren diese Regeln befolgen. Weitere Informationen finden Sie im Sprachreferenzartikel zu statischen abstrakten Membern in Schnittstellen oder im Tutorial zum Erkunden von statischen abstrakten Schnittstellenmembern.

Fehler bei der Deklaration von Typen, die eine Schnittstelle implementieren

Die folgenden Fehler können auftreten, wenn Sie einen Typ definieren, der eine Schnittstelle mit static abstract- oder static virtual-Methoden implementiert:

  • CS8928: Der Typ implementiert kein Member der statischen Schnittstelle. Die Methode kann den Schnittstellenmember nicht implementieren, da er nicht statisch ist.
  • CS8930: Die explizite Implementierung eines benutzerdefinierten Operators muss statisch deklariert werden.
  • CS8932: Die Methode „UnmanagedCallersOnly“ kann den Schnittstellenmember im Typ nicht implementieren.

Diese Fehler deuten alle darauf hin, dass Sie die Methode, die einen statischen abstrakten Schnittstellenmember implementiert, falsch deklariert haben. Diese Member müssen als static deklariert werden. Sie können keine Instanzmember sein. Methoden, die Schnittstellenmember implementieren, können nicht über das System.Runtime.InteropServices.UnmanagedCallersOnlyAttribute-Attribut verfügen, auf das sie angewendet werden.

Fehler beim Aufrufen statischer abstrakter Schnittstellenmember

Die folgenden Fehler können auftreten, wenn Sie versuchen, einen Member aufzurufen, der als static abstract oder static virtual Member einer Schnittstelle definiert ist:

  • CS8920: Die Schnittstelle kann nicht als Typargument verwendet werden. Der statische Member verfügt nicht über eine spezifische Implementierung in der Schnittstelle.
  • CS8926: Auf einen statischen virtuellen oder abstrakten Schnittstellenmember kann nur über einen Typparameter zugegriffen werden.

Aufrufe an Schnittstellenmember, die als static abstract oder static virtual deklariert sind, müssen zur Kompilierzeit aufgelöst werden. Sie müssen zu einem statischen Element aufgelöst werden, das in einem Typ definiert ist, der diese Schnittstelle implementiert. Das bedeutet, dass Sie auf diese Member entweder über einen konkreten Typ, der die Schnittstelle implementiert, oder über einen Typparameter zugreifen müssen, der auf die Implementierung der Schnittstelle beschränkt ist. Um diese Fehler zu beheben, ändern Sie den Typ, der für den Zugriff auf das statische Element verwendet wird.