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.
Ez a cikk a következő fordítóhibákat ismerteti:
- CS0071: Egy esemény explicit felületi implementációjának esemény-kiegészítő szintaxist kell használnia.
- CS0106: A módosító érvénytelen ehhez az elemhez.
- CS0277: A tag nem implementálja az interfész tagját, mert nem nyilvános.
- CS0425: A metódus típusparaméterének megkötéseinek meg kell egyeznie az interfészmetódus típusparaméterének korlátaival. Fontolja meg inkább egy explicit felület implementálását.
- CS0460: A felülbírálási és explicit felületi implementálási metódusok korlátozásai az alapmetódustól öröklődnek, így közvetlenül nem adhatók meg, kivéve az "osztály" vagy a "struct" kényszert.
- CS0470: A metódus nem tudja implementálni a típus interfész-tartozékát. Használjon explicit felületi implementációt.
- CS0473: Az explicit felület implementációjának metódusneve egynél több illesztőtagra érvényes. Az, hogy melyik felülettagot választja ki, az implementációfüggő. Fontolja meg inkább a nem explicit implementáció használatát.
- CS0531: A felülettagok nem rendelkeznek definícióval.
- CS0535: A tag nem implementálja az interfész tagját.
- CS0538: Az explicit felület deklarációjában szereplő tag nem interfész.
- CS0539: Az explicit felületi deklarációban szereplő tag nem található a megvalósítható felület tagjai között.
- CS0540: A tartalmazó típus nem implementálja az interfész tagot.
- CS0541: Az explicit felület deklarálása csak osztályban, rekordban, szerkezetben vagy felületen deklarálható.
- CS0550: A tag hozzáad egy olyan tartozékot, amely nem található az interfésztagban.
- CS0551: Az explicit felület implementálása hiányzik egy tartozékból.
- CS0630: A tag nem tudja implementálni az illesztőtagot, mert __arglist paramétere van.
- CS0686: A tartozék nem tudja implementálni a felület tagját. Használjon explicit felületi implementációt.
- CS0736: A tag nem implementálja a példányinterfész-tagot. Az interfész tag nem implementálható, mert statikus.
- CS0737: A tag nem implementálja a felület tagját. Nem implementálhat felülettagot, mert nem nyilvános.
- CS0738: A tag nem implementálja a felület tagját. Nem lehet, mert nem rendelkezik az egyező visszatérési típussal.
- CS8705: Az interfésztag nem rendelkezik a legspecifikusabb implementációval. Egyik tag sem a legspecifikusabb.
- CS8854: A tag nem implementálja az interfész tagját.
- CS9333: A paramétertípusnak meg kell egyeznie a implementált tagnak.
- CS9334: A visszatérési típusnak meg kell egyeznie a implementált tagnak.
Felületi deklaráció és szintaxis
Az alábbi hibák a megfelelő szintaxissal és struktúrával kapcsolatosak az explicit felületi implementációk deklarálásakor:
- CS0071: Egy esemény explicit felületi implementációjának esemény-kiegészítő szintaxist kell használnia.
- CS0106: A módosító érvénytelen ehhez az elemhez.
- CS0531: A felülettagok nem rendelkeznek definícióval.
- CS0538: Az explicit felület deklarációjában szereplő tag nem interfész.
- CS0541: Az explicit felület deklarálása csak osztályban, rekordban, szerkezetben vagy felületen deklarálható.
Ezeket a hibákat a következő technikákkal háríthatja el:
- Amikor egy interfész eseményt (CS0071) explicit módon valósít meg, manuálisan kell megadnia az
addésremoveesemény hozzáférőket. A fordító nem hozza létre automatikusan ezeket a tartozékokat explicit felületi implementációkhoz, ezért explicit módon kell definiálnia őket az esemény tárolásának és kezelésének megadásához. - Távolítsa el a módosítót az
publicexplicit felületi implementációkból (CS0106). Az explicit felületi implementációk implicit módon nyilvánosak, ha az interfésztípuson keresztül érhetők el, így apublickulcsszó redundánssá válik, és ebben a kontextusban nem engedélyezett. - Távolítsa el a módosítót az
abstractexplicit felületi implementációkból (CS0106). Az explicit felületi implementációk biztosítják a tényleges megvalósítást, és nem jelölhetők absztraktként, mert származtatott osztályokban nem bírálhatók felül. - Távolítsa el a metódus törzsét az illesztőtag-deklarációkból, vagy helyezze át az implementációt egy olyan osztályba vagy szerkezetbe, amely implementálja az interfészt (CS0531). A C# 8.0 előtt a felülettagok nem tartalmazhatnak implementációkat; A C# 8.0-tól kezdődően megadhat alapértelmezett felületi metódusokat adott szintaxis használatával.
- Ellenőrizze, hogy az explicit felületi deklarációban megadott típus tényleges felülettípus-e (CS0538). Csak a felülettípusok használhatók az explicit felület implementálási szintaxisában; Az osztály vagy más nem felületi típus használatára tett kísérlet sérti a explicit implementálási szabályokat.
- Helyezze át az explicit felületi deklarációkat egy olyan osztályba vagy szerkezetbe, amely deklarálja az interfészt az alaplistában (CS0541). Az explicit felületi implementációknak egy osztály- vagy struktúratípus törzsében kell megjelennie, és nem deklarálhatók névtérszinten vagy más környezetekben.
További információ: Interfészek, explicit felület implementálása és interfészesemények implementálása.
Visszatérési típusok és aláírások
A következő hibák akkor fordulnak elő, ha a implementálási módszer aláírása nem egyezik a felülettag deklarációjával:
- CS0738: Az elem nem valósítja meg az interfész elemet. Ez nem lehetséges, mivel nincs megfelelő visszatérési típusa.
- CS8854: A tag nem implementálja az interfész elemet.
- CS9333: A paramétertípusnak meg kell egyeznie a implementált tagnak.
- CS9334: A visszatérési típusnak meg kell egyeznie a implementált tagnak.
Ezeket a hibákat a következő technikákkal háríthatja el:
- Módosítsa a implementálási módszer visszatérési típusát úgy, hogy pontosan egyezzen az illesztőtagban deklarált visszatérési típussal (CS0738, CS9334). A megvalósítás aláírásának pontosan azért kell egyeznie az interfész-deklarációval, mert a metódus aláírása annak a szerződésnek a része, amely meghatározza, hogy melyik illesztőtagot implementálják.
- Győződjön meg arról, hogy a implementálási metódus paramétertípusai pontosan egyeznek az illesztőtagban (CS9333) deklarált paramétertípusokkal. Minden paraméternek azonos típusúnak kell lennie az interfész deklarációjában megadott pozícióban, mivel a paramétertípusok alapvető összetevői annak a metódus-aláírásnak, amelyet a fordító az illesztőtagok implementációinak egyeztetésére használ.
- Adjon hozzá egy tartozékot
inita implementálási tulajdonsághoz, amikor az interfész tulajdonság deklarál egy beállítótinit(CS8854). Ainitkulcsszó lehetővé teszi a tulajdonság inicializálását az objektumépítés során, és megakadályozza a későbbi módosítást, és a megvalósító tulajdonságnak ugyanazt az inicializálási viselkedést kell biztosítania az interfészszerződés teljesítéséhez.
További információ: Interfészek, Tulajdonságok és Csak init-beállítók.
Hiányzó vagy hiányos implementációk
A következő hibák akkor fordulnak elő, ha egy osztály nem implementál teljesen egy interfészt, vagy olyan tagokat implementál, amelyek nem felelnek meg az interfészszerződésnek:
- CS0535: A tag nem implementálja a felület tagját.
- CS0550: A tag hozzáad egy olyan tartozékot, amely nem található az interfésztagban.
- CS0551: Az explicit interfész implementációhoz hiányzik egy hozzáférés.
Ezeket a hibákat a következő technikákkal háríthatja el:
- Adjon implementációt a felületen deklarált összes tagnak, vagy deklarálja a típust
abstract(CS0535). Minden tagot meg kell valósítani az interfész követelményeinek teljesítéséhez. - Távolítsa el az implementált tulajdonság összes hozzáférési módszert, amelyeket az interfész tulajdonságában (CS0550) nem deklaráltak. A implementálási tulajdonság csak az interfészdefinícióban explicit módon deklarált tartozékokat tartalmazhatja, biztosítva, hogy az implementáció ne adjon hozzá funkciókat az interfészszerződésben megadottakon túl.
- Adja hozzá az összes szükséges tartozékot az explicit felület implementációhoz, hogy megfeleljen az interfész deklarációjának (CS0551). Az illesztőben deklarált minden tartozéknak rendelkeznie kell egy megfelelő tartozékkal a megvalósításban egyező aláírásokkal, mivel a megvalósításnak teljesítenie kell az interfész által meghatározott teljes tartozékszerződést.
További információ: Felületek és tulajdonságok.
Tagok egyeztetése és feloldás
A következő hibák akkor fordulnak elő, ha olyan illesztőtagokat próbál implementálni, amelyek nem léteznek a felületen, vagy ha az azt tartalmazó típus nem deklarálja az interfészt:
- CS0539: Az explicit felületi deklarációban szereplő tag nem található a megvalósítható felület tagjai között.
- CS0540: A tartalomtípus nem implementálja az illesztőtagot.
Ezeket a hibákat a következő technikákkal háríthatja el:
- Ellenőrizze, hogy az explicit felület implementációjában szereplő tagnév és aláírás pontosan egyezik-e a felületen deklarált tagdal, vagy távolítsa el a helytelen implementációt (CS0539). A implementálni kívánt tagnak ténylegesen léteznie kell az illesztődefinícióban egyező névvel, visszatérési típussal és paramétertípussal, mivel az explicit felület implementálásához pontos egyeztetésre van szükség az interfészszerződéssel.
- Adja hozzá az interfészt az osztály vagy a szerkezet alaplistájához, vagy távolítsa el az explicit felület implementálását (CS0540). Egy típus csak az öröklési listán deklarált interfészek tagjait tudja explicit módon implementálni, ezért a implementálási típusnak létre kell hoznia az interfészkapcsolatot, mielőtt explicit implementációkat biztosíthat.
További információ: Interfészek és explicit felület implementálása.
Általános típuskorlátozások
Az általános felületi metódusok típusparaméter-korlátozásokkal történő implementálása során a következő hibák fordulnak elő:
- CS0425: A metódus típusparaméterének megkötéseinek meg kell egyeznie az interfészmetódus típusparaméterének korlátaival. Fontolja meg inkább egy explicit felület implementálását.
- CS0460: A felülbírálási és explicit felületi implementálási metódusok korlátozásai az alapmetódustól öröklődnek, így közvetlenül nem adhatók meg, kivéve az "osztály" vagy a "struct" kényszert.
Ezeket a hibákat a következő technikákkal háríthatja el:
- Győződjön meg arról, hogy a
wherevégrehajtási módszer záradéka megegyezik az interfészmetódus deklarációval, vagy megegyezik a korlátozások szemantikai jelentésével (CS0425). A implementáció típusparaméter-megkötéseinek meg kell egyeznie az interfészben vagy az alapmetódusban meghatározottakkal. - Explicit kényszer deklarációk eltávolítása a felülbírálási és explicit felületi implementációs módszerekből (CS0460). A felülbíráló metódus automatikusan örökli a kényszereket az alap- vagy interfészmetódustól, ezért az újradefiniálásuk redundáns, és nem engedélyezett, kivéve a C# 8 és újabb verzióiban engedélyezett konkrét helyzeteket.
- Alkalmazza a
defaultkényszert a null értékű hivatkozástípusokkal kapcsolatos kétértelműségek feloldására a felülírási és explicit interface implementációk során a C# 9 vagy újabb verzió használatakor (CS0460). A kényszer öröklési szabálya alóli kivétel lehetővé teszi, hogy explicit módon adja meg az alapértelmezett korlátozást a null értékű széljegyzetkörnyezetek egyértelműsítéséhez. - Explicit módon adja meg a
where T : classvagywhere T : structkorlátozásokat a felülbírálások és az explicit felület implementációs módszereinél C# 8 vagy újabb használata esetén a null értékű hivatkozástípusú annotációk (CS0460) engedélyezéséhez. Ezek a konkrét megkötések támogatják a hivatkozásra vagy értéktípusokra korlátozott típusparaméterek null értékű referenciatípus-elemzését.
További információ: Típusparaméterekre, interfészekre és null értékű referenciatípusokra vonatkozó korlátozások.
Metódus láthatósága és módosítói
A következő hibák akkor fordulnak elő, ha helytelen akadálymentességi vagy módosító felületi módszereket implementálnak:
- CS0736: A tag nem implementálja a példány interfész tagját. Az interfész tagját nem lehet implementálni, mert statikus.
- CS0737: A tag nem implementálja a felület tagját. Nem implementálhat felülettagot, mert nem nyilvános.
Ezeket a hibákat a következő technikákkal háríthatja el:
- Távolítsa el a
staticmódosítót a felülettagot implementáló metódusdeklarációból (CS0736). A C# 10 előtt a felülettagok példánytagok, nem statikus tagok. - Adja hozzá a
publichozzáférési módosítót a felülettagot implementáló metódushoz (CS0737). Az interfészek minden tagja implicit módonpublicazért van, mert az interfészek nyilvános viselkedésre vonatkozó szerződést határoznak meg, ezért a megvalósító metódusnak nyilvános hozzáférhetőséggel kell rendelkeznie ahhoz, hogy az interfész referencián keresztül elérhető legyen.
További információ: Interfészek és hozzáférési módosítók.
Kiegészítő implementáció és ütközések
A következő hibák akkor fordulnak elő, ha olyan kiegészítő metódusokkal rendelkező adaptertulajdonságokat vagy eseményeket implementál, amelyek láthatósági problémákkal vagy elnevezési ütközésekkel rendelkeznek:
- CS0277: A tag nem implementálja az interfész tagját, mert nem nyilvános.
- CS0470: A metódus nem tudja implementálni a típus interfész-tartozékát. Használjon explicit felületi implementációt.
- CS0686: A tartozék nem tudja implementálni a felület tagját. Használjon explicit felületi implementációt.
Ezeket a hibákat a következő technikákkal háríthatja el:
- Távolítsa el azokat a hozzáférési módosítókat a tulajdonság lekérdezőiből, amelyek korlátozzák a láthatóságot, hogy kevésbé legyen látható, mint
public, vagy adja hozzá apublicmódosítót, ha az hiányzik (CS0277). Az interfész minden tagja implicit módonpublic, így a megvalósító hozzáférőnek nyilvános hozzáférhetőséggel kell rendelkeznie az interfész szerződés teljesítéséhez, és az interfész típusán keresztül is elérhetőnek kell lennie. - Cserélje le a metódusokat kiegészítő típusú nevekre (például
get_PropertyName) a megfelelő tulajdonságszintaxisra explicit felületi implementációval (CS0470). A fordító belsőleg létrehozza a tulajdonságokhoz tartozó akcesszor metódusokat. Ha a fejlesztő megpróbál ilyen fenntartott nevekkel manuálisan metódusokat létrehozni, az ütközik a tulajdonságok megvalósításának mechanizmusával. - Az explicit felület implementálási szintaxisával feloldhatja az elnevezési ütközéseket, ha az illesztő olyan metódusneveket tartalmaz, amelyek megfelelnek az automatikusan létrehozott kiegészítő metódusoknak (CS0686). A fordító automatikusan létrehoz olyan metódusokat, mint
get_Propertyset_Propertya tulajdonságok ésadd_Eventremove_Eventaz események, így ha egy felület pontosan ilyen névvel deklarálja a metódusokat, explicit implementációra van szükség az interfészmetódus és a fordító által létrehozott tartozék egyértelműsítéséhez.
További információ: Felületek, tulajdonságok és események.
Nem egyértelmű és ütköző implementációk
A következő hibák akkor fordulnak elő, ha a fordító nem tudja meghatározni, hogy melyik felület implementációját használja:
- CS0473: Az explicit felület implementációjának metódusneve egynél több illesztőtagra érvényes. Az, hogy melyik felülettagot választja ki, az implementációfüggő. Fontolja meg inkább a nem explicit implementáció használatát.
- CS8705: Az interfésztag "tag" nem rendelkezik a legkonkrétabb megvalósítással. Egyik sem tekinthető a legkonkrétabbnak.
Ezeket a hibákat a következő technikákkal háríthatja el:
- Szüntesse meg az explicit felület implementálását, és ehelyett használjon egyetlen implicit nyilvános implementációt mindkét felületi metódushoz (CS0473). Ha egy általános metódus ugyanazt az aláírást szerzi meg, mint egy nem általános metódus (például amikor
ITest<int>mindkettőt megvalósítja, ésTestMethod(int), illetveTestMethod(T)azonosak lesznek), a közös nyelvi infrastruktúra metaadatrendszere nem tudja egyértelműen meghatározni, hogy melyik illesztő tag melyik implementációs helyhez kötődik, így az implicit implementálás lehetővé teszi, hogy ugyanaz az egy metódus mindkét interfész követelményének megfeleljen. - Adjon meg egy explicit implementációt a implementálási osztályban vagy a szerkezetben, amely feloldja a több alapértelmezett implementáció (CS8705) közötti kétértelműséget. Ez a hiba általában gyémánt öröklési mintákkal fordul elő, ahol egy osztály több felületet implementál, amelyek mindegyike alapértelmezett implementációkat biztosít ugyanahhoz a taghoz. A fordítónak explicit módon meg kell adnia, hogy melyik implementációt használja, vagy adja meg a saját implementációját.
- Strukturálja át az illesztőhierarchiát, hogy elkerülje a gyémántöröklési ütközéseket, ahol több illesztő biztosít alapértelmezett implementációkat ugyanahhoz a taghoz (CS8705). Az illesztőkapcsolatok újratervezésével vagy az alapértelmezett implementációk egyetlen felületen való összevonásával kiküszöbölheti azt a kétértelműséget, amely megakadályozza, hogy a fordító a legspecifikusabb implementációt határozza meg.
További információ: Interfészek és alapértelmezett felületi metódusok.
Különleges megvalósítási korlátozások
A következő hiba akkor fordul elő, ha olyan speciális paramétertípusokat használ, amelyek nem kompatibilisek az interfész implementálásával:
- CS0630: A tag nem tudja implementálni az illesztőtagot, mert __arglist paramétere van.
Ezt a hibát az alábbi technikákkal háríthatja el:
- Távolítsa el a paramétert
__arglista implementálási módszerből (CS0630). A__arglistkulcsszó lehetővé teszi, hogy a metódusok nem felügyelt módon fogadják el az argumentumok változószámait, de ez a funkció nem kompatibilis a felület implementálásával, mivel az interfészszerződések kiszámítható, típusbiztos aláírásokat igényelnek, amelyek fordításkor ellenőrizhetők. - Cserélje le a
__arglistparamétert egyparamstömbparaméterre a változó hosszúságú argumentumlistákhoz (CS0630). Ellentétben__arglistaparamskulcsszó egy típusbiztos mechanizmust biztosít a változó számú argumentum elfogadásához, amely teljes mértékben kompatibilis az interfészek implementálásával, és fenntartja az interfészek által igényelt fordítási idő típusú biztonságot.
További információ: Interfészek és params kulcsszó.