Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A fordító a következő hibákat generálja a statikus absztrakt vagy virtuális tagok érvénytelen deklarációihoz interfészekben:
- CS8920: Az illesztő nem használható típusargumentumként. A statikus tag nem rendelkezik a legspecifikusabb implementációval a felületen.
- CS8921: Az egyváltozós operátor paraméterének a tartalmazó típusnak kell lennie, vagy annak típusparaméterének, amely rá van korlátozva.
-
CS8922: A
++vagy--operátorhoz tartozó paraméter típusának a tartalmazó típusnak vagy ahhoz korlátozott típusparaméterének kell lennie. -
CS8923: A
++vagy--operátor visszatérési típusának meg kell egyeznie a paramétertípussal, vagy a paramétertípusból kell származnia, vagy a tartalmazó típus típusparaméterének kell lennie, kivéve, ha a paramétertípus egy másik típusparaméter. - CS8924: A bináris operátorok egyik paraméterének tartalmaznia kell a tartalomtípust, vagy annak típusparaméterét.
- CS8925: A túlterhelt shift operátor első operandusának ugyanazzal a típussal kell rendelkeznie, mint az azt tartalmazó típusnak, vagy a típusparaméternek össze kell egyeznie vele.
- CS8926: Statikus virtuális vagy absztrakt felületi tag csak típusparaméteren érhető el.
- CS8928: A típus nem implementálja a statikus illesztő tagot. A metódus nem tudja implementálni az illesztőtagot, mert nem statikus.
- CS8930: A felhasználó által definiált operátor explicit implementációját statikusnak kell deklarálni
- CS8931: A felhasználó által definiált átalakításnak a csatolótípusra korlátozott típusparaméterre vagy típusparaméterről kell konvertálnia az illesztőfelületen
- CS8932: A "UnmanagedCallersOnly" metódus nem implementálható illesztőtag típusban
- CS9044: A típus nem implementálja a felület tagját. A metódus nem implementálhat implicit módon elérhetetlen tagokat.
- CS9046: Az illesztőben deklarált egyenlőségi vagy egyenlőtlenségi operátor egyik paraméterének az interfészhez korlátozott típusparaméternek kell lennie
Ezek a hibák a kód három helyén fordulnak elő:
- Amikor statikus absztrakt vagy virtuális tagokkal rendelkező felületet deklarál,
- Ha olyan típust deklarál, amely statikus absztrakt vagy virtuális tagokkal rendelkező felületet implementál, és
- Amikor egy felületen deklarált statikus absztrakt vagy virtuális metódushoz fér hozzá.
A felületi deklaráció hibái
A következő hibákat tapasztalhatja, amikor felületet deklarál static abstract vagy static virtual tagokkal:
- CS8921: Az unáris operátor paraméterének a tartalmazó típusnak kell lennie, vagy annak típusparamétere, amely erre van korlátozva.
-
CS8922: A(z)
++vagy--operátor paramétertípusának a tárolótípusnak vagy annak típusparaméterénék kell lennie, azzal korlátozva. -
CS8923: A
++vagy--operátor visszatérési típusának egyeznie kell a paramétertípussal, származnia kell a paramétertípusból, vagy a tartalmazó típusnak egy arra kényszersített típusparamétere kell, hogy legyen, kivéve, ha a paramétertípus egy eltérő típusparaméter. - CS8924: A bináris operátorok egyik paraméterének tartalmaznia kell a tartalomtípust, vagy annak típusparaméterét.
- CS8925: A túlterhelt shift operátorának első operandusának ugyanazzal a típussal kell rendelkeznie, mint az azt tartalmazó típusnak, vagy egy hozzá kötött típusparaméterrel kell rendelkeznie.
- CS8931: A felhasználó által definiált átalakításnak a csatolótípusra korlátozott típusparaméterre vagy típusparaméterről kell konvertálnia az illesztőfelületen
- CS9046: Az interfészben deklarált egyenlőségi vagy egyenlőtlenségi operátor egyik paraméterének az interfészhez korlátozott típusparaméternek kell lennie
Az illesztőben deklarált nem kötelező operátorok esetében győződjön meg arról, hogy a paraméter maga az interfésztípus, vagy egy olyan típusparaméter T , amely T korlátozza az interfész implementálását (CS8921). Ez a korlátozás biztosítja, hogy az operátor csak olyan típusokra alkalmazható, amelyek implementálják az interfészt, lehetővé téve a fordító számára, hogy fordításkor feloldja a megfelelő implementációt.
A növekményes (++) és a decrement (--) operátorok esetében ellenőrizze, hogy a paraméter ugyanazokat a szabályokat követi-e, mint a többi nem kötelező operátor (CS8922). Ezenkívül a visszatérési típusnak meg kell egyeznie a paramétertípussal, származnia kell belőle, vagy az interfész típusparaméterének kell lennie, amely az illesztőhöz van korlátozva (CS8923). Ezek a szabályok biztosítják, hogy a növekményes és a decrement műveletek olyan kompatibilis típust adjanak vissza, amely az eredeti változóhoz rendelhető vissza.
Bináris operátorok esetén a két paraméter közül legalább az egyiknek tartalmaznia kell az illesztőtípust, vagy egy olyan típusparamétert, amely az interfész implementálásához van korlátozva (CS8924). Ez a követelmény lehetővé teszi, hogy a másik paraméter bármilyen típusú legyen, ezáltal például a(z) T operator +(T left, int right) operátorokat is használhatjuk általános matematikai helyzetekben.
A shift operátorok (<< és >>) esetében az első operandusnak a tartalomtípusnak vagy a korlátozott típusparaméternek (CS8925) kell lennie. A második operandus a normál eltolásoperátori szabályokat követi, és általában int.
A felhasználó által definiált konverziós operátorok esetében az átalakításnak olyan típusparamétert kell tartalmaznia, amely a csatoló felület típusára (CS8931) van korlátozva. Az illesztőben nem definiálhat tetszőleges típusok közötti konverziókat; az átalakításnak az interfészt megvalósító típusokhoz kell kapcsolódnia.
Egyenlőségi (==) és egyenlőtlenségi (!=) operátorok esetében legalább egy paraméternek az interfészhez korlátozott típusparaméternek kell lennie, nem csak magának a felülettípusnak (CS9046). Ez a szigorúbb követelmény az egyenlőségi operátorok számára megfelelő típusbiztonságot biztosít a példányok interfészen keresztüli összehasonlításakor.
Az interfészek operátor-deklarációinak szabályairól további információt a statikus absztrakt tagok a felületeken című témakörben talál. A minták implementálásának gyakorlati útmutatója: A statikus absztrakt felület tagjainak felfedezése.
Hibák a típus implementálási felület deklarációjában
A következő hibákat tapasztalhatja, ha olyan típust határoz meg, amely interfészt static abstract vagy static virtual metódusokat implementál:
- CS8928: A típus nem implementálja a statikus illesztő tagot. A metódus nem tudja implementálni az illesztőtagot, mert nem statikus.
- CS8930: A felhasználó által definiált operátor explicit implementációját statikusnak kell deklarálni
- CS8932: A "UnmanagedCallersOnly" metódus nem implementálható illesztőtag típusban
- CS9044: A típus nem implementálja a felület tagját. A metódus nem implementálhat implicit módon elérhetetlen tagokat.
Amikor statikus absztrakt vagy statikus virtuális adapter tagot implementál, deklarálja a implementálási módszert a static módosító (CS8928) használatával. A példány-felület példánymetelyekkel implementált tagjaival ellentétben a statikus absztrakt tagok statikus implementációkat igényelnek, mert a futtatókörnyezet magát a típust hívja meg, nem egy példányon.
A felhasználó által definiált operátorok felületről történő explicit implementációihoz vegye fel a static módosító elemet a megvalósításba (CS8930). Az operátorok explicit felületi implementációi ugyanazt a statikus követelményt követik, mint az implicit implementációk.
Távolítsa el az System.Runtime.InteropServices.UnmanagedCallersOnlyAttribute attribútumot minden olyan metódusból, amely implementál egy illesztőtagot (CS8932). Az attribútummal megjelölt metódusok csak nem felügyelt kódból hívhatók meg, és nem vehetnek részt a felület implementálásában, mert a futtatókörnyezetnek az interfész-küldési mechanizmuson keresztül kell meghívnia őket.
Ha a implementálási módszer korlátozottabb akadálymentességgel rendelkezik, mint az interfésztag (például egy private felülettagot internal implementáló módszerpublic), implicit implementáció helyett explicit felületi implementálási szintaxist (CS9044) használjon. Az implicit megvalósítás megköveteli, hogy a implementáló tag legalább olyan akadálymentes legyen, mint az általa implementálandó felülettag.
További információ az interfésztagok implementálásáról: Interfészek és explicit felület implementálása.
Statikus absztrakt felülettagok meghívásakor felmerülő hibák
A következő hibaüzenetek jelenhetnek meg, amikor egy interfész static abstract vagy static virtual tagjaként definiált tagot próbál meghívni:
- CS8920: Az illesztő nem használható típusargumentumként. A statikus tag nem rendelkezik a legspecifikusabb implementációval a felületen.
- CS8926: Statikus virtuális vagy absztrakt felületi tag csak típusparaméteren érhető el.
Ha statikus absztrakt tagokat tartalmazó felületet használ típusargumentumként, győződjön meg arról, hogy minden statikus absztrakt tag rendelkezik a legspecifikusabb implementációval (CS8920). Ez a hiba akkor jelenik meg, ha a fordító nem tudja meghatározni, hogy melyik implementációt használja, általában azért, mert több felületi hierarchia ütköző alapértelmezett implementációkat biztosít, vagy nincs implementáció.
A statikus absztrakt vagy statikus virtuális felület tagjait egy olyan típusparaméteren keresztül érheti el, amely az interfész implementálásához van korlátozva, nem pedig közvetlenül a felülettípuson keresztül (CS8926). Használja például a T.MemberName-t ott, ahol a T-t a where T : IMyInterface korlátozza, ahelyett, hogy IMyInterface.MemberName-t használna. A fordítónak konkrét típusra van szüksége a meghívandó implementáció feloldásához, és egy korlátozott típusparaméter általános specializáción keresztül biztosítja ezt a konkrét típust fordításkor.
További információ a statikus absztrakt tagok eléréséről: statikus absztrakt tagok a felületeken.