Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
De compiler genereert de volgende fouten voor ongeldige declaraties van statische abstracte of virtuele leden in interfaces:
- CS8920: De interface kan niet worden gebruikt als typeargument. Statisch lid heeft geen specifieke implementatie in de interface.
- CS8921: De parameter van een unaire operator moet het betreffende type zijn of de bijbehorende typeparameter die hierop is beperkt.
-
CS8922: Het parametertype voor
++of--operator moet het betreffende type zijn, of de bijbehorende typeparameter die hierop is beperkt. -
CS8923: Het retourtype voor de
++- of---operator moet overeenkomen met het parametertype, daarvan afgeleid zijn, of de typeparameter van het omsluitende type zijn die beperkt is tot het parametertype, tenzij het parametertype een andere typeparameter betreft. - CS8924: Een van de parameters van een binaire operator moet het betreffende type zijn of de bijbehorende typeparameter die hierop is beperkt.
- CS8925: De eerste operand van een overbelaste shift-operator moet hetzelfde type hebben als het betreffende type of de bijbehorende typeparameter die hierop is beperkt
- CS8926: Een statisch lid van een virtuele of abstracte interface kan alleen worden geopend op een typeparameter.
- CS8928: Type implementeert geen lid van statische interface. De methode kan het interfacelid niet implementeren omdat deze niet statisch is.
- CS8930: Expliciete implementatie van een door de gebruiker gedefinieerde operator moet statisch worden gedeclareerd
- CS8931: Een door de gebruiker gedefinieerde conversie in een interface moet naar of van een typeparameter van het omsluitende type converteren, dat aan het omsluitende type is gebonden
- CS8932: Methode UnmanagedCallersOnly kan geen interfacelid in type implementeren
- CS9044: Type implementeert geen interfacelid. De methode kan een niet-toegankelijk lid niet impliciet implementeren.
- CS9046: Een van de parameters van een gelijkheids- of ongelijkheidsoperator die in een interface is opgegeven, moet een typeparameter zijn die is beperkt tot de interface
Deze fouten treden op drie plaatsen in uw code op:
- Wanneer u een interface declareert met statische abstracte of virtuele leden,
- Wanneer u een type declareert waarmee een interface met statische abstracte of virtuele leden wordt geïmplementeerd, en
- Wanneer u toegang krijgt tot een statische abstracte of virtuele methode die in een interface is gedeclareerd.
Fouten in interfacedeclaratie
Er kunnen de volgende fouten optreden wanneer u een interface met static abstract of static virtual leden declareert:
- CS8921: De parameter van een unaire operator moet het betreffende type zijn of de bijbehorende typeparameter die hierop is beperkt.
-
CS8922: Het parametertype voor
++of--operator moet het betreffende type zijn, of de bijbehorende typeparameter die hierop is beperkt. -
CS8923: Het retourtype voor de
++of--operator moet overeenkomen met het parametertype, of afgeleid zijn van het parametertype, of de typeparameter van het omvattende type zijn, beperkt tot dit, tenzij het parametertype een ander typeparameter is. - CS8924: Een van de parameters van een binaire operator moet het betreffende type zijn of de bijbehorende typeparameter die hierop is beperkt.
- CS8925: De eerste operant van een overbelaste shift-operator moet hetzelfde type hebben als het betreffende type of de typeparameter die hieraan is gekoppeld
- CS8931: Door de gebruiker gedefinieerde conversie in een interface moet worden geconverteerd naar of van een typeparameter op het omsluittype dat is beperkt tot het insluittype
- CS9046: Een van de parameters van een gelijkheids- of ongelijkheidsoperator die in de interface is gedeclareerd, moet een typeparameter zijn die is beperkt tot de interface
Voor unaire operators die zijn gedeclareerd in een interface, moet u ervoor zorgen dat de parameter ofwel het interfacetype zelf is of een typeparameter T waarbij T beperkt is om de interface (CS8921) te implementeren. Deze beperking zorgt ervoor dat de operator alleen kan worden toegepast op typen die de interface implementeren, zodat de compiler de juiste implementatie tijdens het compileren kan oplossen.
Controleer of de parameter dezelfde regels volgt als andere unaire operators (CS8922) voor de increment (++) en decrement (--) operators. Daarnaast moet het retourtype overeenkomen met het parametertype, ervan afgeleid zijn, of de typeparameter van de interface beperkt tot de interface zijn (CS8923). Deze regels zorgen ervoor dat incrementele en aflopende bewerkingen een compatibel type retourneren dat kan worden toegewezen aan de oorspronkelijke variabele.
Voor binaire operators moet ten minste één van de twee parameters het bevattende interfacetype of een typeparameter zijn die is beperkt om de interface (CS8924) te implementeren. Met deze vereiste kan de andere parameter elk type zijn, waardoor operators zoals T operator +(T left, int right) in algemene wiskundige scenario's kunnen worden ingeschakeld.
Voor shiftoperators (<< en >>) moet de eerste operand het type bevatten of de bijbehorende beperkte typeparameter (CS8925). De tweede operand volgt standaard shift operator rules en is meestal int.
Voor door de gebruiker gedefinieerde conversieoperators moet de conversie een typeparameter bevatten die is beperkt tot het type insluitinterface (CS8931). U kunt geen conversies definiëren tussen willekeurige typen in een interface; de conversie moet betrekking hebben op typen die de interface implementeren.
Voor gelijkheidsoperatoren (==) en ongelijkheid (!=) moet ten minste één parameter een typeparameter zijn die is beperkt tot de interface, niet alleen het interfacetype zelf (CS9046). Deze strengere vereiste voor gelijkheidsoperatoren zorgt voor de juiste typeveiligheid bij het vergelijken van exemplaren via de interface.
Zie statische abstracte leden in interfaces voor meer informatie over de regels voor operatordeclaraties in interfaces. Zie Leden van statische abstracte interface verkennen voor een praktische handleiding voor het implementeren van deze patronen.
Fouten in het type dat een interface-implementatie verklaart
U kunt de volgende fouten tegenkomen wanneer u een type definieert waarmee een interface met static abstract of static virtual methoden wordt geïmplementeerd:
- CS8928: Type implementeert geen lid van statische interface. De methode kan het interfacelid niet implementeren omdat deze niet statisch is.
- CS8930: Expliciete implementatie van een door de gebruiker gedefinieerde operator moet statisch worden gedeclareerd
- CS8932: Methode UnmanagedCallersOnly kan geen interfacelid in type implementeren
- CS9044: Type implementeert geen interfacelid. De methode kan een niet-toegankelijk lid niet impliciet implementeren.
Wanneer u een lid van een statische abstracte of statische virtuele interface implementeert, declareert u de implementatiemethode met behulp van de static modifier (CS8928). In tegenstelling tot exemplaarinterfaceleden die zijn geïmplementeerd door exemplaarmethoden, vereisen statische abstracte leden statische implementaties omdat de runtime deze aanroept op het type zelf, niet op een exemplaar.
Voor expliciete implementaties van door de gebruiker gedefinieerde operators vanuit een interface, neemt u de static wijzigingsfunctie op in de implementatie (CS8930). Expliciete interface-implementaties van operators volgen dezelfde statische vereiste als impliciete implementaties.
Verwijder het System.Runtime.InteropServices.UnmanagedCallersOnlyAttribute kenmerk uit een methode waarmee een interfacelid (CS8932) wordt geïmplementeerd. Methoden die zijn gemarkeerd met dit kenmerk, kunnen alleen worden aangeroepen vanuit onbeheerde code en kunnen niet deelnemen aan interface-implementatie omdat de runtime deze moet aanroepen via het interface-dispatchmechanisme.
Als de implementatiemethode meer beperkende toegankelijkheid heeft dan het interfacelid (bijvoorbeeld een of private methode die een internalpublic interfacelid implementeert), gebruikt u expliciete syntaxis voor interface-implementatie in plaats van impliciete implementatie (CS9044). Impliciete implementatie vereist dat het implementatielid minstens zo toegankelijk is als het interfacelid dat wordt geïmplementeerd.
Zie Interfaces en expliciete interface-implementatie voor meer informatie over het implementeren van interfaceleden.
Fouten bij het aanroepen van leden van statische abstracte interface
Mogelijk ziet u de volgende fouten wanneer u probeert een lid aan te roepen dat is gedefinieerd als een static abstract of static virtual lid van een interface:
- CS8920: De interface kan niet worden gebruikt als typeargument. Statisch lid heeft geen specifieke implementatie in de interface.
- CS8926: Een statisch lid van een virtuele of abstracte interface kan alleen worden geopend op een typeparameter.
Wanneer u een interface met statische abstracte leden gebruikt als een typeargument, moet u ervoor zorgen dat alle statische abstracte leden een meest specifieke implementatie beschikbaar hebben (CS8920). U ziet deze fout wanneer de compiler niet kan bepalen welke implementatie moet worden gebruikt, meestal omdat meerdere interfacehiërarchieën conflicterende standaard implementaties bieden of er geen implementatie bestaat.
Toegang krijgen tot statische abstracte of statische virtuele interfacemembers via een typeparameter die is beperkt tot het implementeren van de interface, in plaats van rechtstreeks via het interfacetype (CS8926). Gebruik bijvoorbeeld T.MemberName waar T wordt beperkt door where T : IMyInterface, in plaats IMyInterface.MemberNamevan . De compiler heeft een concreet type nodig om op te lossen welke implementatie moet worden aangeroepen, en een beperkte typeparameter biedt dat concrete type tijdens het compileren via algemene specialisatie.
Zie statische abstracte leden in interfaces voor meer informatie over toegang krijgen tot statische abstracte leden.