Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Den här artikeln beskriver följande kompilatorfel:
- CS0071: En explicit gränssnittsimplementering av en händelse måste använda syntax för händelseåtkomst.
- CS0106: Modifieraren är inte giltig för det här objektet.
- CS0277: Medlem implementerar inte gränssnittsmedlemmen eftersom den saknar ett offentligt tillstånd.
- CS0425: Begränsningarna för typparametern för metoden måste matcha begränsningarna för typparametern för gränssnittsmetoden. Överväg att använda en explicit gränssnittsimplementering i stället.
- CS0460: Begränsningar för metoder för åsidosättning och explicit gränssnittsimplementering ärvs från basmetoden, så de kan inte anges direkt, förutom antingen en "klass" eller en "struct"-begränsning.
- CS0470: Metoden kan inte implementera gränssnittsåtkomst för typ. Använd en explicit gränssnittsimplementering.
- CS0473: Explicit gränssnittsimplementering "metodnamn" matchar mer än en gränssnittsmedlem. Vilken gränssnittsmedlem som faktiskt väljs är implementeringsberoende. Överväg att använda en icke-explicit implementering i stället.
- CS0531: Gränssnittsmedlemmar kan inte ha en definition.
- CS0535: Medlemmen implementerar inte gränssnittsmedlem.
- CS0538: Medlem i explicit gränssnittsdeklaration är inte ett gränssnitt.
- CS0539: Medlem i explicit gränssnittsdeklaration finns inte bland medlemmar i gränssnittet som kan implementeras.
- CS0540: Innehållande typ implementerar inte gränssnittselement.
- CS0541: Explicit gränssnittsdeklaration kan bara deklareras i en klass, post, struct eller ett gränssnitt.
- CS0550: Elementet lägger till en accessor som inte finns i gränssnittselementets definition.
- CS0551: Explicit gränssnittsimplementering saknar en accessor.
- CS0630: Medlemmen kan inte implementera gränssnittsmedlemmen eftersom den har en parameter __arglist.
- CS0686: Accessor kan inte implementera gränssnittsmedlem. Använd en explicit gränssnittsimplementering.
- CS0736: Medlemmen implementerar inte instansgränssnittsmedlem. Det går inte att implementera gränssnittsmedlemmen eftersom den är statisk.
- CS0737: Medlemmen implementerar inte gränssnittsmedlem. Det går inte att implementera en gränssnittsmedlem eftersom den inte är offentlig.
- CS0738: Medlemmen implementerar inte gränssnittsmedlem. Det kan inte eftersom den inte har den matchande returtypen.
- CS8705: Gränssnittsmedlemmen har ingen mest specifik implementering. Ingen av dem är mest specifik.
- CS8854: Medlem implementerar inte gränssnittsmedlemmen.
- CS9333: Parametertypen måste matcha implementerad medlem.
- CS9334: Returtypen måste matcha implementerad medlem.
Gränssnittsdeklaration och syntax
Följande fel gäller korrekt syntax och struktur när explicita gränssnittsimplementeringar deklareras:
- CS0071: En explicit gränssnittsmimplementering av en händelse måste använda händelseaccessorsyntax.
- CS0106: Modifieraren är inte giltig för det här objektet.
- CS0531: Gränssnittsmedlemmar kan inte ha en definition.
- CS0538: Medlem i explicit gränssnittsdeklaration är inte ett gränssnitt.
- CS0541: Explicit gränssnittsdeklaration kan bara deklareras i en klass, post, struct eller ett gränssnitt.
Du kan korrigera dessa fel med hjälp av följande tekniker:
- Du måste manuellt ange
addochremoveaccessorer för händelser när du uttryckligen implementerar en gränssnittshändelse (CS0071). Kompilatorn genererar inte automatiskt dessa åtkomstorer för explicita gränssnittsimplementeringar, så du måste definiera dem explicit för att ange hur händelsen lagras och hanteras. -
publicTa bort modifieraren från explicita gränssnittsimplementeringar (CS0106). Explicita gränssnittsimplementeringar är implicit offentliga när de nås via gränssnittstypen, vilket gör nyckelordetpublicredundant och inte tillåtet i det här sammanhanget. -
abstractTa bort modifieraren från explicita gränssnittsimplementeringar (CS0106). Explicita gränssnittsimplementeringar ger den faktiska implementeringen och kan inte markeras som abstrakt eftersom de inte kan åsidosättas i härledda klasser. - Ta bort metodtexten från medlemsdeklarationer för gränssnittet eller flytta implementeringen till en klass eller struct som implementerar gränssnittet (CS0531). Innan C# 8.0 kan gränssnittsmedlemmar inte innehålla implementeringar. Från och med C# 8.0 kan du ange standardgränssnittsmetoder med hjälp av specifik syntax.
- Kontrollera att den typ som anges i den explicita gränssnittsdeklarationen är en faktisk gränssnittstyp (CS0538). Endast gränssnittstyper kan användas i explicit gränssnittsimplementeringssyntax. försök att använda en klass eller annan icke-gränssnittstyp strider mot de explicita implementeringsreglerna.
- Flytta explicita gränssnittsdeklarationer till en klass eller struct som deklarerar gränssnittet i baslistan (CS0541). Explicita gränssnittsimplementeringar måste visas i brödtexten för en klass eller structtyp och kan inte deklareras på namnområdesnivå eller i andra kontexter.
Mer information finns i Gränssnitt, Explicit gränssnittsimplementering och Så här implementerar du gränssnittshändelser.
Returnera typer och signaturer
Följande fel uppstår när implementeringsmetodens signatur inte matchar medlemsdeklarationen för gränssnittet:
- CS0738: Medlemmen implementerar inte gränssnittsmedlem. Det kan inte eftersom den inte har den matchande returtypen.
- CS8854: Medlemmen implementerar inte gränssnittsmedlemmen.
- CS9333: Parametertypen måste matcha implementerad medlem.
- CS9334: Returtypen måste matcha implementerad medlem.
Du kan korrigera dessa fel med hjälp av följande tekniker:
- Ändra returtypen för implementeringsmetoden så att den exakt matchar returtypen som deklarerats i gränssnittsmedlemmen (CS0738, CS9334). Implementeringens signatur måste matcha gränssnittsdeklarationen just för att metodsignaturen är en del av kontraktet som avgör vilken gränssnittsmedlem som implementeras.
- Kontrollera att parametertyperna i implementeringsmetoden exakt matchar de parametertyper som deklarerats i gränssnittsmedlemmen (CS9333). Varje parameter måste ha samma typ i samma position som anges i gränssnittsdeklarationen, eftersom parametertyper är grundläggande komponenter i metodsignaturen som kompilatorn använder för att matcha implementeringar med gränssnittsmedlemmar.
- Lägg till en
initaccessor i implementeringsegenskapen när gränssnittsegenskapen deklarerar eninitsetter (CS8854). Nyckelordetinittillåter egenskapsinitiering under objektkonstruktionen samtidigt som ändringar förhindras efteråt, och implementeringsegenskapen måste ange samma initieringsbeteende för att uppfylla gränssnittskontraktet.
Mer information finns i Gränssnitt, Egenskaper och Init-only-setters.
Saknade eller ofullständiga implementeringar
Följande fel uppstår när en klass misslyckas med att helt implementera ett gränssnitt eller implementerar medlemmar som inte matchar gränssnittskontraktet:
- CS0535: Medlemmen implementerar inte gränssnittsmedlem.
- CS0550: Medlemmen lägger till en accessor som inte hittades i gränssnittsmedlemmen.
- CS0551: Uttrycklig gränssnittsimplementering saknar en åtkomstfunktion.
Du kan korrigera dessa fel med hjälp av följande tekniker:
- Ange en implementering för varje medlem som deklareras i gränssnittet eller deklarera typen som
abstract(CS0535). Varje medlem måste implementeras för att uppfylla gränssnittskraven. - Ta bort alla accessorer från den implementerande egenskapen som inte deklareras i gränssnittsegenskapen (CS0550). Implementeringsegenskapen kan bara inkludera de åtkomster som uttryckligen deklareras i gränssnittsdefinitionen, vilket säkerställer att implementeringen inte lägger till funktioner utöver vad gränssnittskontraktet anger.
- Lägg till alla nödvändiga åtkomster till den explicita gränssnittsimplementeringen för att matcha gränssnittsdeklarationen (CS0551). Varje accessor som deklareras i gränssnittet måste ha en motsvarande accessor i implementeringen med matchande signaturer, eftersom implementeringen måste uppfylla det fullständiga accessorkontraktet som definieras av gränssnittet.
Mer information finns i Gränssnitt och egenskaper.
Matchning och lösning av medlemmar
Följande fel uppstår vid försök att implementera gränssnittsmedlemmar som inte finns i gränssnittet eller när den innehållande typen inte deklarerar gränssnittet:
- CS0539: Medlem i explicit gränssnittsdeklaration finns inte bland medlemmar i gränssnittet som kan implementeras.
- CS0540: Innehållande typ implementerar inte gränssnittsmedlem.
Du kan korrigera dessa fel med hjälp av följande tekniker:
- Kontrollera att medlemsnamnet och signaturen i den explicita gränssnittsimplementeringen exakt matchar en medlem som deklarerats i gränssnittet, eller ta bort den felaktiga implementeringen (CS0539). Den medlem som du försöker implementera måste faktiskt finnas i gränssnittsdefinitionen med matchande namn, returtyp och parametertyper, eftersom explicit gränssnittsimplementering kräver exakt korrespondens med gränssnittskontraktet.
- Lägg till gränssnittet i klassens eller structens baslista eller ta bort den explicita gränssnittsimplementeringen (CS0540). En typ kan bara uttryckligen implementera medlemmar i gränssnitt som deklareras i arvslistan, så implementeringstypen måste upprätta gränssnittsrelationen innan den kan tillhandahålla explicita implementeringar.
Mer information finns i Gränssnitt och explicit gränssnittsimplementering.
Allmänna typbegränsningar
Följande fel uppstår vid implementering av allmänna gränssnittsmetoder med typparameterbegränsningar:
- CS0425: Begränsningarna för typparametern för metoden måste matcha begränsningarna för typparametern för gränssnittsmetoden. Överväg att använda en explicit gränssnittsimplementering i stället.
- CS0460: Begränsningar för metoder för åsidosättning och explicit gränssnittsimplementering ärvs från basmetoden, så de kan inte anges direkt, förutom antingen en "klass" eller en "struct"-begränsning.
Du kan korrigera dessa fel med hjälp av följande tekniker:
-
whereSe till att -satsen i implementeringsmetoden är identisk med deklarationen för gränssnittsmetoden eller matchar den semantiska innebörden av begränsningarna (CS0425). Typparameterbegränsningarna i implementeringen måste matcha de som definierats i gränssnittet eller basmetoden. - Ta bort explicita villkorsdeklarationer från metoder för åsidosättning och explicit gränssnittsimplementering (CS0460). Åsidosättningsmetoden ärver sina begränsningar automatiskt från bas- eller gränssnittsmetoden, så redeclaring av dem är redundant och tillåts inte förutom för specifika fall som tillåts i C# 8 och senare.
- Tillämpa begränsningen
defaultför att lösa tvetydigheter med nullbara referenstyper vid överskuggning och explicita gränssnittsimplementeringar vid användning av C# 9 eller senare (CS0460). Med det här undantaget till regeln för begränsningsarv kan du uttryckligen ange standardbegränsningen för att klargöra kontexter för nullbar annotering. - Ange uttryckligen
where T : class- ellerwhere T : struct-begränsningar för metoder för åsidosättning och uttrycklig gränssnittsimplementering när du använder C# 8 eller senare för att aktivera annotationer för nullable-referenstyper (CS0460). Dessa specifika begränsningar är tillåtna för att stödja nullbar referenstypanalys på typparametrar som är begränsade till referens- eller värdetyper.
Mer information finns i Begränsningar för typparametrar, gränssnitt och nullbara referenstyper.
Metodsynlighet och modifierare
Följande fel uppstår vid implementering av gränssnittsmetoder med felaktig tillgänglighet eller modifierare:
- CS0736: Medlemmen implementerar inte instansgränssnittsmedlem. Det går inte att implementera gränssnittsmedlemmen eftersom den är statisk.
- CS0737: Medlemmen implementerar inte gränssnittsmedlem. Det går inte att implementera en gränssnittsmedlem eftersom den inte är offentlig.
Du kan korrigera dessa fel med hjälp av följande tekniker:
-
staticTa bort modifieraren från metoddeklarationen som implementerar gränssnittsmedlemmen (CS0736). Innan C# 10 är gränssnittsmedlemmar instansmedlemmar, inte statiska medlemmar. -
publicLägg till åtkomstmodifieraren i metoden som implementerar gränssnittsmedlemmen (CS0737). Alla gränssnittsmedlemmar är implicitapubliceftersom gränssnitt definierar ett kontrakt för offentligt beteende, så implementeringsmetoden måste också ha offentlig tillgänglighet för att vara tillgänglig via gränssnittsreferensen.
Mer information finns i Gränssnitt och åtkomstmodifierare.
Implementering av accessor och konflikter
Följande fel uppstår vid implementering av gränssnittsegenskaper eller händelser med åtkomstmetoder som har synlighetsproblem eller namngivningskonflikter:
- CS0277: En medlem implementerar inte en gränssnittskomponent eftersom den inte är publik.
- CS0470: Metoden kan inte implementera en gränssnittsaccessor-metod för typen. Använd en explicit gränssnittsimplementering.
- CS0686: Accessor kan inte implementera gränssnittsmedlem. Använd en explicit gränssnittsimplementering.
Du kan korrigera dessa fel med hjälp av följande tekniker:
- Ta bort alla åtkomstmodifierare från egenskapsåtkomster som begränsar synligheten till mindre synliga än
public, eller lägg till modifieraren om denpublicsaknas (CS0277). Alla gränssnittsmedlemmar är implicitpublic, så den implementerande accessorn måste också ha publik tillgänglighet för att uppfylla gränssnittskontraktet och vara tillgänglig via gränssnittstypen. - Ersätt metoder med accessorliknande namn (till exempel
get_PropertyName) med rätt egenskapssyntax med explicit gränssnittsimplementering (CS0470). Kompilatorn genererar åtkomstmetoder internt för egenskaper och försök att manuellt skapa metoder med dessa reserverade namn står i konflikt med mekanismen för egenskapsimplementering. - Använd explicit gränssnittsimplementeringssyntax för att lösa namngivningskonflikter när gränssnittet innehåller metodnamn som matchar de automatiskt genererade åtkomstmetoderna (CS0686). Kompilatorn genererar automatiskt metoder som
get_Propertyochset_Propertyför egenskaper, ochadd_Eventremove_Eventför händelser, så om ett gränssnitt deklarerar metoder med dessa exakta namn krävs explicit implementering för att skilja mellan gränssnittsmetoden och den kompilatorgenererade accessorn.
Mer information finns i Gränssnitt, Egenskaper och Händelser.
Tvetydiga och motstridiga implementeringar
Följande fel uppstår när kompilatorn inte kan avgöra vilken gränssnittsimplementering som ska användas:
- CS0473: Explicit gränssnittsimplementering "metodnamn" matchar mer än en gränssnittsmedlem. Vilken gränssnittsmedlem som faktiskt väljs är implementeringsberoende. Överväg att använda en icke-explicit implementering i stället.
- CS8705: Gränssnittsmedlemmen "medlem" har inte en mest specifik implementering. Ingen av dem är mest specifik.
Du kan korrigera dessa fel med hjälp av följande tekniker:
- Eliminera den explicita gränssnittsimplementeringen och använd i stället en enda implicit offentlig implementering för båda gränssnittsmetoderna (CS0473). När en generisk metod hämtar samma signatur som en icke-generisk metod (till exempel vid implementering
ITest<int>där bådaTestMethod(int)ochTestMethod(T)blir identiska) kan metadatasystemet för den gemensamma språkinfrastrukturen inte entydigt avgöra vilken gränssnittsmedlem som binder till vilket implementeringsfack, så med implicit implementering kan den enda metoden uppfylla båda gränssnittskraven. - Ange en explicit implementering i implementeringsklassen eller structen som löser tvetydigheten mellan flera standardimplementeringar (CS8705). Det här felet uppstår vanligtvis med rombarvmönster där en klass implementerar flera gränssnitt som var och en tillhandahåller standardimplementeringar för samma medlem. Kompilatorn kräver att du uttryckligen anger vilken implementering som ska användas eller anger din egen implementering.
- Omstrukturera gränssnittshierarkin för att undvika diamantarvkonflikter där flera gränssnitt tillhandahåller standardimplementeringar för samma medlem (CS8705). Genom att omforma gränssnittsrelationerna eller konsolidera standardimplementeringarna till ett enda gränssnitt kan du eliminera tvetydigheten som hindrar kompilatorn från att fastställa den mest specifika implementeringen.
Mer information finns i Gränssnitt och standardgränssnittsmetoder.
Särskilda implementeringsbegränsningar
Följande fel uppstår när du använder särskilda parametertyper som inte är kompatibla med gränssnittsimplementering:
- CS0630: Medlemmen kan inte implementera gränssnittets medlem eftersom det har en __arglist parameter.
Du kan åtgärda det här felet med hjälp av följande tekniker:
- Ta bort parametern
__arglistfrån implementeringsmetoden (CS0630). Med nyckelordet__arglistkan metoder acceptera variabelt antal argument på ett ohanterat sätt, men den här funktionen är inte kompatibel med gränssnittsimplementering eftersom gränssnittskontrakt kräver förutsägbara, typsäkra signaturer som kan verifieras vid kompileringstillfället. - Ersätt parametern
__arglistmed enparamsmatrisparameter för argumentlistor med variabel längd (CS0630). Till skillnad från__arglistger nyckelordetparamsen typsäker mekanism för att acceptera variabelantal argument som är helt kompatibla med gränssnittsimplementering och upprätthåller den kompileringstidstypsäkerhet som krävs för gränssnitt.
Mer information finns i Nyckelord för gränssnitt och params.