Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Kompilátor generuje následující chyby pro neplatné deklarace statických abstraktních nebo virtuálních členů v rozhraních:
- CS8920: Rozhraní nelze použít jako argument typu. Statický člen nemá v rozhraní nejvýraznější implementaci.
- CS8921: Parametr unárního operátoru musí být obsahující typ nebo jeho parametr typu omezený na něj.
- cs-CZ: CS8922: Typ parametru pro operátor
++nebo--musí být obsahující typ nebo jeho parametr typu omezený na tento typ. -
CS8923: Návratový typ pro operátor
++nebo--se musí shodovat s typem parametru, nebo musí být odvozen z typu parametru, nebo musí být parametr typu obsahujícího typu omezený na něj, pokud typ parametru není jiný parametr typu. - CS8924: Jeden z parametrů binárního operátoru musí být obsahující typ nebo jeho parametr typu omezený na něj.
- CS8925: První operand přetíženého operátoru posunu musí mít stejný typ jako obsahující typ nebo jeho typový parametr omezený na něj.
- CS8926: Statický virtuální nebo abstraktní člen rozhraní je přístupný pouze u parametru typu.
- CS8928: Typ neimplementuje člena statického rozhraní. Metoda nemůže implementovat člen rozhraní, protože není statický.
- CS8930: Explicitní implementace uživatelem definovaného operátoru musí být deklarována statická
- CS8931: Převod definovaný uživatelem v rozhraní musí převádět na nebo z parametru typu, který je u nadřazeného typu omezen na tento nadřazený typ.
- CS8932: Metoda UnmanagedCallersOnly nemůže implementovat člen rozhraní typu
- CS9044: Typ neimplementuje člena rozhraní. Metoda nemůže implicitně implementovat nepřístupný člen.
- CS9046: Jedním z parametrů operátoru rovnosti nebo nerovnosti deklarovaného v rozhraní musí být parametr typu omezený na rozhraní.
K těmto chybám dochází na třech místech v kódu:
- Když deklarujete rozhraní se statickými abstraktními nebo virtuálními členy,
- Když deklarujete typ, který implementuje rozhraní se statickými abstraktními nebo virtuálními členy, a
- Při přístupu ke statické abstraktní nebo virtuální metodě deklarované v rozhraní.
Chyby v deklaraci rozhraní
Při deklarování rozhraní s static abstract nebo static virtual členy může dojít k následujícím chybám:
- CS8921: Parametr unárního operátoru musí být obsahující typ nebo jeho parametr typu omezený na něj.
-
CS8922: Typ parametru pro operátor
++nebo--musí být obsahující typ nebo jeho parametr typu omezený na tento typ. -
CS8923: Návratový typ pro operátor
++nebo--se musí buď shodovat s typem parametru, nebo být odvozen z typu parametru, nebo být parametr typu definovaný pro obsahující typ a omezený na něj, pokud typ parametru není odlišným typovým parametrem. - CS8924: Jeden z parametrů binárního operátoru musí být obsahující typ nebo jeho parametr typu omezený na něj.
- CS8925: První operand přetíženého operátoru posunu musí mít stejný typ jako typ obsahující nebo mít typ parametr omezující tento typ.
- CS8931: Převod definovaný uživatelem v rozhraní musí převádět na nebo z parametru typu u nadřazeného typu, který je omezen na tento nadřazený typ.
- CS9046: Jedním z parametrů operátoru rovnosti nebo nerovnosti deklarovaného v rozhraní musí být parametr typu omezený na rozhraní.
U unárních operátorů deklarovaných v rozhraní se ujistěte, že je parametr buď samotným typem rozhraní, nebo parametrem T typu, který T je omezen na implementaci rozhraní (CS8921). Toto omezení zajišťuje, že operátor lze použít pouze u typů, které implementují rozhraní, což kompilátoru umožňuje přeložit správnou implementaci v době kompilace.
Pro operátory inkrementace (++) a dekrementace (--) ověřte, že parametr dodržuje stejná pravidla jako ostatní unární operátory (CS8922). Návratový typ navíc musí odpovídat typu parametru, odvodit z něj nebo musí být parametrem typu rozhraní omezeném na rozhraní (CS8923). Tato pravidla zajišťují, aby operace přírůstku a dekrementace vrátily kompatibilní typ, který lze přiřadit zpět k původní proměnné.
Pro binární operátory musí být alespoň jeden ze dvou parametrů obsahující typ rozhraní nebo parametr typu omezený pro implementaci rozhraní (CS8924). Tento požadavek umožňuje, aby byl druhý parametr libovolným typem, což umožňuje použití operátorů jako T operator +(T left, int right) v obecných matematických scénářích.
Pro operátory shift (<< a >>), první operand musí být obsahující typ nebo jeho parametr omezeného typu (CS8925). Druhý operand se řídí standardními pravidly operátoru posunu a je obvykle int.
U uživatelem definovaných převodních operátorů musí převod zahrnovat parametr typu, který je omezen na nadřazený typ rozhraní (CS8931). Převody mezi libovolnými typy v rozhraní nelze definovat; převod musí souviset s typy, které implementují rozhraní.
Pro operátory rovnosti (==) a nerovnosti (!=) musí být alespoň jeden parametr typu omezený na rozhraní, nejen samotný typ rozhraní (CS9046). Tento přísnější požadavek na operátory rovnosti zajišťuje správnou typovou bezpečnost při porovnávání instancí prostřednictvím rozhraní.
Další informace o pravidlech pro deklarace operátorů v rozhraních naleznete v abstraktních členech ve statických rozhraních. Praktický průvodce implementací těchto vzorů najdete v tématu Prozkoumání statických abstraktních členů rozhraní.
Chyby při implementaci rozhraní deklarovaného typem
Při definování typu, který implementuje rozhraní s static abstract metodami, static virtual se můžou vyskytnout následující chyby:
- CS8928: Typ neimplementuje člena statického rozhraní. Metoda nemůže implementovat člen rozhraní, protože není statický.
- CS8930: Explicitní implementace uživatelem definovaného operátoru musí být deklarována statická
- CS8932: Metoda 'UnmanagedCallersOnly' nemůže implementovat člena rozhraní v typu
- CS9044: Typ neimplementuje člena rozhraní. Metoda nemůže implicitně implementovat nepřístupný člen.
Při implementaci statického abstraktního nebo statického člena virtuálního rozhraní deklarujte implementovací metodu pomocí modifikátoru static (CS8928). Na rozdíl od členů rozhraní instancí implementovaných metodami instance vyžadují statické abstraktní členy statické implementace, protože modul runtime je vyvolá na samotném typu, ne v instanci.
Pro explicitní implementace uživatelem definovaných operátorů z rozhraní uveďte static modifikátor v implementaci (CS8930). Explicitní implementace rozhraní operátorů se řídí stejným statickým požadavkem jako implicitní implementace.
Odeberte atribut System.Runtime.InteropServices.UnmanagedCallersOnlyAttribute z každé metody, která implementuje člena rozhraní (CS8932). Metody označené pomocí tohoto atributu lze volat pouze z nespravovaného kódu a nemůžou se účastnit implementace rozhraní, protože modul runtime je musí volat prostřednictvím mechanismu odesílání rozhraní.
Pokud implementační metoda má více omezující přístupnost než člen rozhraní (například private metoda internal implementující public člen rozhraní), použijte explicitní syntaxi implementace rozhraní místo implicitní implementace (CS9044). Implicitní implementace vyžaduje, aby implementační člen byl alespoň tak přístupný jako člen rozhraní, který implementuje.
Další informace o implementaci členů rozhraní naleznete v tématu Rozhraní a explicitní implementace rozhraní.
Chyby volání členů statického abstraktního rozhraní
Při pokusu o volání člena definovaného jako static abstract nebo static virtual člena rozhraní se můžou zobrazit následující chyby:
- CS8920: Rozhraní nelze použít jako argument typu. Statický člen nemá v rozhraní nejvýraznější implementaci.
- CS8926: Statický virtuální nebo abstraktní člen rozhraní je přístupný pouze u parametru typu.
Pokud jako argument typu použijete rozhraní se statickými abstraktními členy, ujistěte se, že všechny statické abstraktní členy mají k dispozici nejvýraznější implementaci (CS8920). Tato chyba se zobrazí, když kompilátor nedokáže určit, kterou implementaci použít, obvykle proto, že několik hierarchií rozhraní poskytuje konfliktní výchozí implementace nebo neexistuje žádná implementace.
Přístup ke statickým abstraktním nebo statickým členům virtuálního rozhraní prostřednictvím parametru typu, který je omezen na implementaci rozhraní, nikoli přímo prostřednictvím typu rozhraní (CS8926). Například použijte T.MemberName , kde T je omezena where T : IMyInterfacespíše než IMyInterface.MemberName. Kompilátor potřebuje konkrétní typ k vyřešení toho, kterou implementaci se má volat, a parametr omezeného typu poskytuje konkrétní typ v době kompilace prostřednictvím obecné specializace.
Další informace o přístupu ke statickým abstraktním členům naleznete v tématu statické abstraktní členy v rozhraních.