Sdílet prostřednictvím


Řešení chyb a upozornění souvisejících se členy, kteří implementují rozhraní

Tento článek se zabývá následujícími chybami kompilátoru:

  • CS0071: Explicitní implementace rozhraní události musí používat syntaxi přístupového objektu událostí.
  • CS0106: Modifikátor není pro tuto položku platný.
  • CS0277: Člen neimplementuje člen rozhraní, jelikož není veřejný.
  • CS0425: Omezení parametru typu metody musí odpovídat omezením pro parametr typu metody rozhraní. Místo toho zvažte použití explicitní implementace rozhraní.
  • CS0460: Omezení pro přepsání a explicitní metody implementace rozhraní se dědí ze základní metody, takže je nelze zadat přímo, s výjimkou omezení "třída" nebo "struktura".
  • CS0470: Metoda nemůže implementovat přístupové objekty rozhraní pro typ. Použijte explicitní implementaci rozhraní.
  • CS0473: Explicitní implementace rozhraní Název metody odpovídá více než jednomu členu rozhraní. Který člen rozhraní je ve skutečnosti vybrán, je závislý na implementaci. Zvažte místo toho použití ne explicitní implementace.
  • CS0531: Členové rozhraní nemohou mít definici.
  • CS0535: Člen neimplementuje člena rozhraní.
  • CS0538: Člen v explicitní deklaraci rozhraní není rozhraní.
  • CS0539: Člen v explicitní deklaraci rozhraní není nalezen mezi členy rozhraní, které lze implementovat.
  • CS0540: Typ, který je obsažen, neimplementuje člena rozhraní.
  • CS0541: Explicitní deklarace rozhraní lze deklarovat pouze ve třídě, záznamu, struktuře nebo rozhraní.
  • CS0550: Člen přidá příslušenství, které nebylo nalezeno v členu rozhraní.
  • CS0551: Explicitní implementace rozhraní chybí příslušenství.
  • CS0630: Člen nemůže implementovat člen rozhraní, protože má parametr __arglist.
  • CS0686: Příslušenství nemůže implementovat člena rozhraní. Použijte explicitní implementaci rozhraní.
  • CS0736: Člen neimplementuje instanční člen rozhraní. Nemůže implementovat člen rozhraní, protože je statický.
  • CS0737: Člen neimplementuje člena rozhraní. Nemůže implementovat člena rozhraní, protože není veřejný.
  • CS0738: Člen neimplementuje člen rozhraní. Nemůže, protože nemá odpovídající návratový typ.
  • CS8705: Člen rozhraní nemá nejvýraznější implementaci. Žádný člen není nejvýraznější.
  • CS8854: Člen neimplementuje člen rozhraní.
  • CS9333: Typ parametru musí odpovídat implementovanému členu.
  • CS9334: Návratový typ musí odpovídat implementovanému členu.

Deklarace rozhraní a syntaxe

Následující chyby se týkají správné syntaxe a struktury při deklarování explicitních implementací rozhraní:

  • CS0071: Explicitní implementace rozhraní události musí používat syntaxi přístupového objektu událostí.
  • CS0106: Modifikátor není pro tuto položku platný.
  • CS0531: Členové rozhraní nemohou mít definici.
  • CS0538: Člen v explicitní deklaraci rozhraní není rozhraní.
  • CS0541: Explicitní deklarace rozhraní lze deklarovat pouze ve třídě, záznamu, struktuře nebo rozhraní.

Tyto chyby můžete opravit pomocí následujících technik:

  • Při explicitní implementaci události rozhraní (CS0071), musíte ručně poskytnout přístupové objekty událostí add a remove. Kompilátor negeneruje tyto přístupové objekty automaticky pro explicitní implementace rozhraní, takže je musíte definovat explicitně, abyste určili, jak se událost ukládá a spravuje.
  • Odeberte public modifikátor z explicitních implementací rozhraní (CS0106). Explicitní implementace rozhraní jsou implicitně veřejné při přístupu prostřednictvím typu rozhraní, což znamená, že public klíčové slovo je redundantní a není povoleno v tomto kontextu.
  • abstract Odeberte modifikátor z explicitních implementací rozhraní (CS0106). Explicitní implementace rozhraní poskytují skutečnou implementaci a nelze je označit jako abstraktní, protože je nelze přepsat v odvozených třídách.
  • Odeberte tělo metody z deklarací členů rozhraní nebo přesuňte implementaci do třídy nebo struktury, která implementuje rozhraní (CS0531). Před C# 8.0 nemůžou členové rozhraní obsahovat implementace; počínaje jazykem C# 8.0 můžete zadat výchozí metody rozhraní s použitím konkrétní syntaxe.
  • Ověřte, že typ zadaný v deklaraci explicitního rozhraní je skutečným typem rozhraní (CS0538). V syntaxi implementace explicitního rozhraní lze použít pouze typy rozhraní; pokus o použití třídy nebo jiného typu rozhraní porušuje explicitní pravidla implementace.
  • Přesuňte explicitní deklarace rozhraní do třídy nebo struktury, která deklaruje rozhraní v základním seznamu (CS0541). Explicitní implementace rozhraní se musí objevit v těle třídy nebo typu struktury a nelze je deklarovat na úrovni oboru názvů nebo v jiných kontextech.

Další informace naleznete v tématu Rozhraní, explicitní implementace rozhraní a jak implementovat události rozhraní.

Návratové typy a podpisy

K následujícím chybám dochází v případě, že podpis implementční metody neodpovídá deklaraci člena rozhraní:

  • CS0738: Člen neimplementuje člen rozhraní. Nemůže, protože nemá odpovídající návratový typ.
  • CS8854: Člen neimplementuje člena rozhraní.
  • CS9333: Typ parametru musí odpovídat implementovanému členu.
  • CS9334: Návratový typ musí odpovídat implementovanému členu.

Tyto chyby můžete opravit pomocí následujících technik:

  • Změňte návratový typ implementované metody tak, aby přesně odpovídal návratovém typu deklarovanému ve členu rozhraní (CS0738, CS9334). Podpis implementace musí přesně odpovídat deklaraci rozhraní, protože podpis metody je součástí kontraktu, který určuje, který člen rozhraní se implementuje.
  • Ujistěte se, že typy parametrů v implementované metodě přesně odpovídají typům parametrů deklarovaným v členu rozhraní (CS9333). Každý parametr musí mít stejný typ ve stejné pozici jako zadaný v deklaraci rozhraní, protože typy parametrů jsou základními součástmi podpisu metody, které kompilátor používá ke shodě implementací se členy rozhraní.
  • Když vlastnost rozhraní deklaruje init setter (init), přidejte do implementní vlastnosti přístupový objekt. Klíčové init slovo umožňuje inicializaci vlastností během vytváření objektů, zatímco následně brání úpravám, a implementovaná vlastnost musí poskytnout stejné inicializační chování, aby uspokojil kontrakt rozhraní.

Další informace naleznete v tématu Rozhraní, Vlastnosti a Init-only setters.

Chybějící nebo neúplné implementace

K následujícím chybám dochází v případě, že se třídě nepodaří plně implementovat rozhraní nebo implementuje členy, které neodpovídají kontraktu rozhraní:

  • CS0535: Člen neimplementuje člen rozhraní.
  • CS0550: Člen přidá příslušenství, které nebylo nalezeno v členu rozhraní.
  • CS0551: Explicitní implementace rozhraní chybí příslušenství.

Tyto chyby můžete opravit pomocí následujících technik:

  • Zadejte implementaci pro každého člena deklarovaného v rozhraní nebo deklarujte typ jako abstract (CS0535). Každý člen musí být implementován, aby splňoval požadavky rozhraní.
  • Odeberte všechny přístupové objekty z implementované vlastnosti, které nejsou deklarovány ve vlastnosti rozhraní (CS0550). Implementační vlastnost může zahrnovat pouze přístupové objekty explicitně deklarované v definici rozhraní a zajistit, aby implementace nepřidá funkce nad rámec toho, co kontrakt rozhraní určuje.
  • Přidejte všechny požadované přístupové objekty k implementaci explicitního rozhraní tak, aby odpovídaly deklaraci rozhraní (CS0551). Každý přístupový objekt deklarovaný v rozhraní musí mít odpovídající příslušenství v implementaci s odpovídajícími podpisy, protože implementace musí splňovat kompletní kontrakt příslušenství definovaný rozhraním.

Další informace naleznete v tématu Rozhraní a vlastnosti.

Párování členů a řešení

K následujícím chybám dochází při pokusu o implementaci členů rozhraní, které neexistují v rozhraní nebo pokud obsahující typ nehlásí rozhraní:

  • CS0539: Člen v explicitní deklaraci rozhraní není nalezen mezi členy rozhraní, které lze implementovat.
  • CS0540: Obsahující typ neimplementuje člen rozhraní.

Tyto chyby můžete opravit pomocí následujících technik:

  • Ověřte, že název člena a podpis v explicitní implementaci rozhraní přesně odpovídají členu deklarovanému v rozhraní, nebo odeberte nesprávnou implementaci (CS0539). Člen, který se pokoušíte implementovat, musí ve skutečnosti existovat v definici rozhraní s odpovídajícím názvem, návratovým typem a typy parametrů, protože explicitní implementace rozhraní vyžaduje přesnou korespondenci se kontraktem rozhraní.
  • Přidejte rozhraní do základního seznamu třídy nebo struktury nebo odeberte explicitní implementaci rozhraní (CS0540). Typ může explicitně implementovat pouze členy rozhraní, která deklaruje ve svém seznamu dědičnosti, takže implementační typ musí nejprve vytvořit vztah s rozhraním, než může poskytovat explicitní implementace.

Další informace naleznete v tématu Rozhraní a explicitní implementace rozhraní.

Omezení obecného typu

Při implementaci obecných metod rozhraní s omezeními parametrů typu dochází k následujícím chybám:

  • CS0425: Omezení parametru typu metody musí odpovídat omezením pro parametr typu metody rozhraní. Místo toho zvažte použití explicitní implementace rozhraní.
  • CS0460: Omezení pro přepsání a explicitní metody implementace rozhraní se dědí ze základní metody, takže je nelze zadat přímo, s výjimkou omezení "třída" nebo "struktura".

Tyto chyby můžete opravit pomocí následujících technik:

  • where Ujistěte se, že je klauzule v implementovací metodě identická s deklarací metody rozhraní nebo odpovídá sémantickému významu omezení (CS0425). Omezení parametru typu v implementaci musí odpovídat omezením definovaným v rozhraní nebo základní metodě.
  • Odeberte explicitní deklarace omezení z metod přepsání a explicitní implementace rozhraní (CS0460). Metoda přepsání zdědí svá omezení automaticky ze základní metody nebo metody rozhraní, takže jejich opětovné přiřazení je redundantní a není povoleno s výjimkou konkrétních případů povolených v jazyce C# 8 a novějších.
  • Aplikujte omezení default k vyřešení nejednoznačností způsobených referenčními typy s možnou hodnotou null v přepsáních a explicitních implementacích rozhraní, pokud používáte C# 9 nebo novější (CS0460). Tato výjimka pravidla dědičnosti omezení umožňuje explicitně zadat výchozí omezení, které má nejednoznačit kontexty poznámek s možnou hodnotou null.
  • Explicitně určete omezení where T : class nebo where T : struct pro metody přepsání a explicitní implementaci rozhraní při použití jazyka C# 8 nebo novějších, abyste umožnili poznámky k typům s možnými hodnotami null (CS0460). Tato specifická omezení umožňují podporovat analýzu typu odkazu s možnou hodnotou null u parametrů typu, které jsou omezeny na odkazy nebo typy hodnot.

Další informace najdete v tématu Omezení parametrů typu, rozhraní a odkazových typů s možnou hodnotou Null.

Viditelnost a modifikátory metod

Při implementaci metod rozhraní s nesprávnými přístupnosti nebo modifikátory dochází k následujícím chybám:

  • CS0736: Člen neimplementuje instanční člen rozhraní. Nemůže implementovat člena rozhraní, protože je statický.
  • CS0737: Člen neimplementuje člena rozhraní. Nemůže implementovat člena rozhraní, protože není veřejný.

Tyto chyby můžete opravit pomocí následujících technik:

  • Odeberte modifikátor static z deklarace metody, která implementuje člena rozhraní (CS0736). Před C# 10 jsou členy rozhraní členy instance, nikoli statické členy.
  • public Přidejte modifikátor přístupu do metody, která implementuje člen rozhraní (CS0737). Všichni členové rozhraní jsou implicitně public , protože rozhraní definují kontrakt pro veřejné chování, takže implementace metody musí mít také veřejnou přístupnost, aby byla přístupná prostřednictvím odkazu na rozhraní.

Další informace naleznete v tématu Rozhraní a modifikátory přístupu.

Implementace přístupového objektu a konflikty

Při implementaci vlastností rozhraní nebo událostí s metodami přístupového objektu, které mají problémy s viditelností nebo konflikty pojmenování, dochází k následujícím chybám:

  • CS0277: Člen neimplementuje člena rozhraní, protože není veřejným.
  • CS0470: Metoda nemůže implementovat přístupový objekt rozhraní daného typu. Použijte explicitní implementaci rozhraní.
  • CS0686: Příslušenství nemůže implementovat člena rozhraní. Použijte explicitní implementaci rozhraní.

Tyto chyby můžete opravit pomocí následujících technik:

  • Odeberte všechny modifikátory přístupu z přístupových metod vlastností, které omezují viditelnost na úroveň nižší než public, nebo přidejte modifikátor public, pokud chybí (CS0277). Všichni členové rozhraní jsou implicitně public, takže implementace přístupového objektu musí mít také veřejnou přístupnost, aby uspokojila kontrakt rozhraní a byla přístupná prostřednictvím typu rozhraní.
  • Nahraďte metody názvy podobných přístupovým objektům (například get_PropertyName) správnou syntaxí vlastností pomocí explicitní implementace rozhraní (CS0470). Kompilátor generuje přístupové metody interně pro vlastnosti, a když se pokoušíte ručně vytvořit metody s těmito rezervovanými názvy, dostáváte se do konfliktu s implementačním mechanismem vlastností.
  • Pomocí explicitní syntaxe implementace rozhraní můžete vyřešit konflikty pojmenování v případě, že rozhraní obsahuje názvy metod, které odpovídají automaticky generovaným metodám přístupového objektu (CS0686). Kompilátor automaticky generuje metody jako get_Property a set_Property pro vlastnosti a add_Eventremove_Event pro události, takže pokud rozhraní deklaruje metody s těmito přesnými názvy, explicitní implementace je nutná k nejednoznačnosti mezi metodou rozhraní a objektem vygenerovaným kompilátorem.

Další informace naleznete v tématu Rozhraní, Vlastnosti a Události.

Nejednoznačné a konfliktní implementace

K následujícím chybám dochází v případě, že kompilátor nedokáže určit, která implementace rozhraní se má použít:

  • CS0473: Explicitní implementace rozhraní Název metody odpovídá více než jednomu členu rozhraní. Který člen rozhraní je ve skutečnosti vybrán, je závislý na implementaci. Zvažte místo toho použití ne explicitní implementace.
  • CS8705: Člen rozhraní 'member' nemá nejvýraznější implementaci. Ani jedno není nejvýraznější.

Tyto chyby můžete opravit pomocí následujících technik:

  • Eliminujte explicitní implementaci rozhraní a místo toho použijte jednu implicitní veřejnou implementaci pro obě metody rozhraní (CS0473). Když obecná metoda získá stejný podpis jako ne generická metoda (například při implementaci ITest<int> , kde je obě TestMethod(int) a TestMethod(T) identická), systém metadat společné jazykové infrastruktury nemůže jednoznačně určit, který člen rozhraní vytvoří vazbu s jakým slotem implementace, takže použití implicitní implementace umožňuje, aby jedna metoda splňovala obě požadavky rozhraní.
  • Zadejte explicitní implementaci v implementační třídě nebo struktuře, která řeší nejednoznačnost mezi několika výchozími implementacemi (CS8705). K této chybě obvykle dochází u dědičnostní vzorů typu diamant, kdy třída implementuje více rozhraní, z nichž každé poskytuje výchozí implementaci pro stejný člen. Kompilátor potřebuje explicitně určit, kterou implementaci použít, nebo poskytnout vlastní implementaci.
  • Restrukturalizujte hierarchii rozhraní, aby nedocházelo ke konfliktům diamantové dědičnosti, kdy více rozhraní poskytuje výchozí implementace pro tentýž člen (CS8705). Přepracováním relací rozhraní nebo sloučením výchozích implementací do jednoho rozhraní můžete eliminovat nejednoznačnost, která brání kompilátoru v určení nejkonfiliktnější implementace.

Další informace naleznete v tématu Rozhraní a výchozí metody rozhraní.

Zvláštní omezení implementace

K následující chybě dochází při použití speciálních typů parametrů, které nejsou kompatibilní s implementací rozhraní:

  • CS0630: Člen nemůže implementovat člen rozhraní, protože má parametr __arglist.

Tuto chybu můžete opravit pomocí následujících technik:

  • Odeberte parametr __arglist z implementující metody (CS0630). Klíčové __arglist slovo umožňuje metodám přijímat proměnlivá čísla argumentů nespravovaným způsobem, ale tato funkce není kompatibilní s implementací rozhraní, protože kontrakty rozhraní vyžadují předvídatelné, typově bezpečné podpisy, které lze ověřit v době kompilace.
  • __arglist Nahraďte parametr parametrem pole pro seznamy argumentů s proměnnou params délkou (CS0630). Na rozdíl od __arglist klíčového slova params poskytuje typově bezpečný mechanismus pro přijímání proměnlivého počtu argumentů, který je plně kompatibilní s implementací rozhraní a udržuje bezpečnost typů při kompilaci, kterou rozhraní vyžadují.

Další informace naleznete v tématu Rozhraní a klíčové slovo params.