Dela via


Statiska abstrakta och virtuella gränssnittsmedlemsfel och varningar

Kompilatorn genererar följande fel för ogiltiga deklarationer av statiska abstrakta eller virtuella medlemmar i gränssnitt:

  • CS8920: Gränssnittet kan inte användas som typargument. Statisk medlem har inte en mest specifik implementering i gränssnittet.
  • CS8921: Parametern för en unary-operator måste vara den innehållande typen eller dess typparameter begränsad till den.
  • CS8922: Parametertypen för ++ eller -- operatorn måste vara den innehållande typen eller dess typparameter begränsad till den.
  • CS8923: Returtypen för ++ eller -- operatorn måste antingen matcha parametertypen eller härledas från parametertypen, eller vara den typparameter som är begränsad till den, såvida inte parametertypen är en annan typparameter.
  • CS8924: En av parametrarna för en binär operator måste vara den innehållande typen eller dess typparameter begränsad till den.
  • CS8925: Den första operanden för en överbelastad skiftoperator måste ha samma typ som den innehållande typen eller dess typparameter begränsad till den
  • CS8926: En statisk virtuell eller abstrakt gränssnittsmedlem kan endast nås på en typparameter.
  • CS8928: Typen implementerar inte medlem i statiskt gränssnitt. Metoden kan inte implementera gränssnittsmedlemmen eftersom den inte är statisk.
  • CS8930: Explicit implementering av en användardefinierad operator måste deklareras som statisk
  • CS8931: Användardefinierad konvertering i ett gränssnitt måste konverteras till eller från en typparameter på den omslutande typ som är begränsad till den omslutande typen
  • CS8932: Metoden "UnmanagedCallersOnly" kan inte implementera gränssnittsmedlem i typ
  • CS9044: Typen implementerar inte gränssnittsmedlem. Metoden kan inte implicit implementera en otillgänglig medlem.
  • CS9046: En av parametrarna för en likhets- eller ojämlikhetsoperator som deklareras i ett gränssnitt måste vara en typparameter som är begränsad till gränssnittet

Dessa fel uppstår på tre platser i koden:

Fel i gränssnittsdeklaration

Du kan stöta på följande fel när du deklarerar ett gränssnitt med static abstract eller static virtual medlemmar:

  • CS8921: Parametern för en unary-operator måste vara den innehållande typen eller dess typparameter begränsad till den.
  • CS8922: Parametertypen för ++ eller -- operatorn måste vara den innehållande typen eller dess typparameter begränsad till den.
  • CS8923: Returtypen för ++ eller -- operatorn måste antingen matcha parametertypen eller härledas från parametertypen, eller vara den typparameter som är begränsad till den, såvida inte parametertypen är en annan typparameter.
  • CS8924: En av parametrarna för en binär operator måste vara den innehållande typen eller dess typparameter begränsad till den.
  • CS8925: Den första operanden för en överbelastad skiftoperator måste ha samma typ som den innehållande typen eller en typparameter som är begränsad till den
  • CS8931: Användardefinierad konvertering i ett gränssnitt måste konverteras till eller från en typparameter på den omslutande typ som är begränsad till den omslutande typen
  • CS9046: En av parametrarna för en likhets- eller ojämlikhetsoperator som deklareras i gränssnittet måste vara en typparameter som är begränsad till gränssnittet

För unary-operatorer som deklareras i ett gränssnitt kontrollerar du att parametern antingen är själva gränssnittstypen eller en typparameter T där T är begränsad för att implementera gränssnittet (CS8921). Den här begränsningen säkerställer att operatorn endast kan tillämpas på typer som implementerar gränssnittet, vilket gör att kompilatorn kan lösa rätt implementering vid kompileringstillfället.

För operatorerna increment (++) och decrement (--) kontrollerar du att parametern följer samma regler som andra unary-operatorer (CS8922). Dessutom måste returtypen antingen matcha parametertypen, härleda från den eller vara gränssnittets typparameter begränsad till gränssnittet (CS8923). Dessa regler säkerställer att åtgärder för ökning och minskning returnerar en kompatibel typ som kan tilldelas tillbaka till den ursprungliga variabeln.

För binära operatorer måste minst en av de två parametrarna vara den som innehåller gränssnittstypen eller en typparameter som är begränsad för att implementera gränssnittet (CS8924). Det här kravet gör att den andra parametern kan vara vilken typ som helst, vilket möjliggör operatorer som T operator +(T left, int right) i allmänna matematiska scenarier.

För skiftoperatorer (<< och >>) måste den första operanden vara den innehållande typen eller dess begränsade typparameter (CS8925). Den andra operand följer standardregler för skiftoperatorer och är vanligtvis int.

För användardefinierade konverteringsoperatorer måste konverteringen omfatta en typparameter som är begränsad till den omslutande gränssnittstypen (CS8931). Du kan inte definiera konverteringar mellan godtyckliga typer i ett gränssnitt. konverteringen måste relatera till typer som implementerar gränssnittet.

För likhetsoperatorer (==) och olikhet (!=) måste minst en parameter vara en typparameter som är begränsad till gränssnittet, inte bara själva gränssnittstypen (CS9046). Detta striktare krav för likhetsoperatorer säkerställer korrekt typsäkerhet vid jämförelse av instanser via gränssnittet.

Mer information om reglerna för operatordeklarationer i gränssnitt finns i statiska abstrakta medlemmar i gränssnitt. En praktisk guide för att implementera dessa mönster finns i Utforska statiska abstrakta gränssnittsmedlemmar.

Fel i typ som implementerar gränssnittsdeklaration

Du kan stöta på följande fel när du definierar en typ som implementerar ett gränssnitt med static abstract eller static virtual metoder:

  • CS8928: Typen implementerar inte medlem i statiskt gränssnitt. Metoden kan inte implementera gränssnittsmedlemmen eftersom den inte är statisk.
  • CS8930: Explicit implementering av en användardefinierad operator måste deklareras som statisk
  • CS8932: Metoden "UnmanagedCallersOnly" kan inte implementera gränssnittsmedlem i typ
  • CS9044: Typen implementerar inte gränssnittsmedlem. Metoden kan inte implicit implementera en otillgänglig medlem.

När du implementerar en statisk abstrakt eller statisk virtuell gränssnittsmedlem deklarerar du implementeringsmetoden med hjälp static av modifieraren (CS8928). Till skillnad från instansgränssnittsmedlemmar som implementeras med instansmetoder kräver statiska abstrakta medlemmar statiska implementeringar eftersom körningen anropar dem på själva typen, inte på en instans.

För explicita implementeringar av användardefinierade operatorer från ett gränssnitt inkluderar du static modifieraren i implementeringen (CS8930). Explicita gränssnittsimplementeringar av operatorer följer samma statiska krav som implicita implementeringar.

System.Runtime.InteropServices.UnmanagedCallersOnlyAttribute Ta bort attributet från alla metoder som implementerar en gränssnittsmedlem (CS8932). Metoder som markeras med det här attributet kan bara anropas från ohanterad kod och kan inte delta i gränssnittsimplementeringen eftersom körningen måste anropa dem via mekanismen för gränssnittssändning.

Om implementeringsmetoden har mer begränsad tillgänglighet än gränssnittsmedlemmen (till exempel en eller private en internal metod som implementerar en public gränssnittsmedlem) använder du explicit gränssnittsimplementeringssyntax i stället för implicit implementering (CS9044). Implicit implementering kräver att implementeringsmedlemmen är minst lika tillgänglig som den gränssnittsmedlem som implementeras.

Mer information om hur du implementerar gränssnittsmedlemmar finns i Gränssnitt och explicit gränssnittsimplementering.

Fel vid anrop av statiska abstrakta gränssnittsmedlemmar

Du kan se följande fel när du försöker anropa en medlem som definierats som en static abstract eller static virtual medlem i ett gränssnitt:

  • CS8920: Gränssnittet kan inte användas som typargument. Statisk medlem har inte en mest specifik implementering i gränssnittet.
  • CS8926: En statisk virtuell eller abstrakt gränssnittsmedlem kan endast nås på en typparameter.

När du använder ett gränssnitt med statiska abstrakta medlemmar som ett typargument kontrollerar du att alla statiska abstrakta medlemmar har en mest specifik implementering tillgänglig (CS8920). Du ser det här felet när kompilatorn inte kan avgöra vilken implementering som ska användas, vanligtvis på grund av att flera gränssnittshierarkier tillhandahåller motstridiga standardimplementeringar eller att det inte finns någon implementering.

Få åtkomst till statiska abstrakta eller statiska virtuella gränssnittsmedlemmar via en typparameter som är begränsad till att implementera gränssnittet, i stället för via gränssnittstypen direkt (CS8926). Använd till exempel T.MemberName där T begränsas av where T : IMyInterface, snarare än IMyInterface.MemberName. Kompilatorn behöver en konkret typ för att lösa vilken implementering som ska anropas, och en begränsad typparameter tillhandahåller den konkreta typen vid kompileringstid genom allmän specialisering.

Mer information om hur du kommer åt statiska abstrakta medlemmar finns i statiska abstrakta medlemmar i gränssnitt.