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 C#-fordító hibákat és figyelmeztetéseket generál a rekordtípusok helytelen használata esetén. A rekordtípusok olyan beépített tagokat biztosítanak, amelyek értékalapú egyenlőséget valósítanak meg. Ezek a diagnosztikák segítenek a rekordtípusok deklarálására és használatára vonatkozó szabályok betartásában.
- CS8851: A "Type" az "Equals" (Egyenlő) értékeket határozza meg, a GetHashCode-ot azonban nem.
- CS8858: A fogadó típusa nem érvényes rekordtípus, és nem szerkezettípus.
- CS8859: A "Clone" nevű tagok nem engedélyezettek a rekordokban.
- CS8860: A típusok és aliasok nem nevezhetők rekordnak.
- CS8864: A rekordok csak objektumtól vagy más rekordtól örökölhetnek.
- CS8865: Csak rekordok örökölhetnek más rekordoktól.
- CS8866: A rekordtagnak olvasható példánytulajdonságnak vagy típusú mezőnek kell lennie, hogy megfeleljen a pozícióparaméternek.
- CS8870: A tag nem lehet lezárva, mert a tartalmazó rekord nincs lezárva.
- CS8872: A tagnak engedélyeznie kell a felülírást, mert az azt tartalmazó rekord nincs lezárva.
- CS8873: A rekordtagnak nyilvánosnak kell lennie.
- CS8874: A rekordtagnak típust kell visszaadnia.
- CS8875: A rekordtagot védeni kell.
- CS8877: Előfordulhat, hogy a rekordtag nem statikus.
- CS8879: A rekordtagnak privátnak kell lennie.
- CS8908: A típus nem használható rekordmezőkhöz.
- CS8913: Az ehhez a paraméterhez tartozó pozíciós tag el van rejtve.
Ezenkívül ez a cikk a következő figyelmeztetést ismerteti:
- CS8907: A paraméter olvasatlan. Elfelejtette használni, hogy inicializálja a tulajdonságot ezzel a névvel?
Szintetizált tagi aláírások
- CS8870: A tag nem zárható le, mert a tartalmazó rekord nincs lezárva.
- CS8872: A tagnak lehetővé kell tennie a felülírást, mert az őt tartalmazó rekord nincs lezárva.
- CS8873: A rekordtagnak nyilvánosnak kell lennie.
- CS8874: A rekordtagnak típust kell visszaadnia.
- CS8875: A rekordtagot védetté kell tenni.
- CS8877: Előfordulhat, hogy a rekordtag nem statikus.
- CS8879: A rekordtagnak privátnak kell lennie.
Amikor egy olyan tagot deklarál, amelyet a fordító egy rekordtípus számára máskülönben szintetizálna, a deklarációnak meg kell egyeznie a várt aláírással, hozzáférhetőséggel és módosítókkal. A teljes szabályokért tekintse meg a rekordok funkciós specifikációját.
A hibák kijavításához alkalmazza a következő módosításokat a kifejezetten deklarált rekordtagokra:
- Módosítsa a(z)
Equalsmetódus, a deconstruct metódus, aGetHashCode, aEqualityContracttulajdonság és aop_Equality,op_Inequalityoperátorok hozzáférését a következőre:public. A fordító megköveteli, hogy ezek a tagok nyilvánosan hozzáférhetők legyenek, hogy az értékalapú egyenlőség megfelelően működjön az összes hívási környezetben (CS8873). 1– Módosítsa aPrintMembersmetódus elérhetőségétprotected, amikor nem lezárt rekordosztályban deklarálja. A metódusnakprotectedkell lennie, mert a származtatott rekordok felülírják azt, hogy saját tulajdonságaikat is belefoglalják a formázott kimenetbe (CS8875). - Amikor lezárt rekordosztályban vagy rekordstruktúrában deklarálja, módosítsa a
PrintMembersmetódusprivatehozzáférhetőségét. Mivel nem létezik származtatott típus, a metódusnak nem kell elérhetőnek lennie a típuson kívül (CS8879). - Távolítsa el a
staticmódosítót bármely explicit módon deklarált szintetizált tagból. A szintetizált tagok meghatározott rekordpéldányokon működnek olyan viselkedések implementálásához, mint az egyenlőségi összehasonlítás, a formázás és a másolás, ezért példánytagoknak kell lenniük (CS8877). - Módosítsa a tag visszatérési típusát úgy, hogy megfeleljen a fordító által várt típusnak. Például a
EqualityContracttulajdonságnakSystem.Typeértéket kell visszaadnia, és aEqualsmetódusnakboolértéket kell visszaadnia. A fordító ezekre a pontos visszatérési típusokra támaszkodik, hogy helyes kódot hozzon létre az egyenlőséghez és más szintetizált viselkedésekhez (CS8874). - Távolítsa el a
sealedmódosítót egy nem lezárt rekord explicit módon deklarált szintetizált tagjából. A származtatott rekordoknak felül kell tudniuk bírálni ezeket a tagokat, hogy saját értékalapú egyenlőségi és formázási logikát (CS8870) biztosítsanak. - Deklarálja a kifejezetten megadott szintetizált tagokat egy nem lezárt rekordban
virtualvagyoverride. A fordító megköveteli, hogy ezek a tagok engedélyezzenek felülbírálást, hogy az öröklési hierarchiában lévő származtatott rekordok testre szabhassák a viselkedésüket (CS8872).
Pozíciós tagok
- CS8866: A rekordtagnak olvasható példánytulajdonságnak vagy típusú mezőnek kell lennie, hogy megfeleljen a pozícióparaméternek.
- CS8907: A paraméter olvasatlan. Elfelejtette használni, hogy inicializálja a tulajdonságot ezzel a névvel?
- CS8908: A típus nem használható rekordmezőkhöz.
- CS8913: A paraméterhez tartozó helyzeti tag el van rejtve.
Pozíciórekord deklarálásakor a fordító az egyes pozícióparamétereknek megfelelő tulajdonságokat szintetizálja. Ezek a diagnosztikák azt jelzik, hogy az explicit deklarációk ütköznek ezekkel a szintetizált tulajdonságokkal. A teljes szabályokért tekintse meg a rekordok funkciós specifikációját.
A hibák kijavításához alkalmazza a következő módosításokat a pozíciórekord-deklarációkra:
- Módosítsa a pozícióparaméternek megfelelő explicit módon deklarált tagokat, hogy az egy olvasható példánytulajdonság vagy mező legyen, amelynek a típusa megegyezik a paraméter típusával. A fordítónak szüksége van arra, hogy a tag olvasható és típuskompatibilis legyen, így a szintetizált
Deconstructmetódus és a pozicionális mintázatillesztés megfelelően elérheti az értéket (CS8866). - Ha explicit konstruktort ad meg, győződjön meg arról, hogy az egyes pozícióparaméterek a konstruktor törzsében lévő megfelelő tulajdonság inicializálására szolgálnak. A fordító figyelmeztetést ad, ha egy paraméter fel nem használt állapotba kerül, mert általában elírást vagy eltérést jelez a paraméter neve és a tulajdonság neve között, ami miatt a tulajdonság nem lesz inicializálva (CS8907).
- Módosítsa a rekordban deklarált mező típusát az adott környezetben érvényes típusra. Bizonyos típusok, például
Span<T>másref structtípusok nem használhatók mezőként egy rekordban, mert a rekordtípusok megkövetelik, hogy minden mező kompatibilis legyen a halomfoglalással és az értékalapú egyenlőséggel (CS8908). - Távolítsa el a
newmódosítót egy olyan származtatott rekord egyik tagjától, amely elrejt egy pozíciótagot az alaprekordból. Ha egy pozíciótag rejtett, a fordító nem tudja összevetni a pozícióparamétert a megfelelő tulajdonságával, ami megszakítja a szintetizáltDeconstructmetódust és a pozíción alapuló mintázati illesztést (CS8913).
Egyenlőségi tagok
- CS8851: A típus az "Equals" (Egyenlő) értékeket határozza meg, a GetHashCode-ot azonban nem.
- CS8858: A fogadó típusa nem érvényes rekordtípus, és nem szerkezettípus.
A rekordtípusok beépített értékalapú egyenlőséget biztosítanak. Ezek a diagnosztikák akkor merülnek fel, ha a nyilatkozatok ütköznek az egyenlőségi szerződéssel. Az egyenlőségre vonatkozó teljes szabályokért tekintse meg az egyenlőség összehasonlítását.
A hibák kijavításához alkalmazza a következő módosításokat:
- Adjon hozzá egy
GetHashCodemetódust, valahányszor meghatároz egyEqualsmetódust. Az egyenlőségi szerződés megköveteli, hogy az egyenlőnek ítélt objektumok ugyanazt a kivonatkódot eredményezik, ezért a fordító kényszeríti, hogy ez a két módszer mindig együtt legyen definiálva (CS8851). - Módosítsa egy kifejezés fogadóját
withúgy, hogy az egy rekordtípus vagy egy szerkezettípus legyen. Awithkifejezés módosított másolatot hoz létre a típus másolási konstruktorával, amely csak rekordtípusok és szerkezettípusok esetén érhető el (CS8858).
Rekordöröklés
- CS8864: A rekordok csak objektumtól vagy más rekordtól örökölhetnek
- CS8865: Csak rekordok örökölhetnek a rekordoktól.
A rekordosztálytípusok meghatározott öröklési szabályokat követnek. A teljes szabályokért tekintse meg a rekordok funkciós specifikációját.
A hibák kijavításához alkalmazza a következő módosításokat:
- Módosítsa a rekordosztály alaptípusát úgy, hogy az a
objectvagy egy másik rekordosztályból származzon. A rekordtípusok a fordító által szintetizált tagokra támaszkodnak az egyenlőség és a másolás érdekében, amelyek csak más rekordtípusokkal kompatibilisek, így a fordító nem engedélyezi a rekordok öröklését egy nem rekordosztályból (CS8864). - Módosítsa a rekordosztálytól öröklő nem rekordosztályt úgy, hogy az inkább rekordosztályként legyen deklarálva. Mivel a rekordtípusok egyenlőséget, klónozást és más, konzisztens öröklési lánctól függő tagokat szintetizálnak, a fordító megköveteli, hogy a hierarchia minden típusa rekordosztály legyen (CS8865). A rekordstruktúratípusok nem vehetnek részt az öröklési hierarchiákban az illesztők implementálásán túl.
Fenntartott tagok nevei
- CS8859: A "Clone" nevű tagok nem engedélyezettek a rekordokban.
- CS8860: A típusok és aliasok nem nevezhetők rekordnak.
A fordító bizonyos neveket lefoglal a rekordtípusok használatához. A teljes szabályokért tekintse meg a rekordok funkciós specifikációját.
A hibák kijavításához alkalmazza a következő módosításokat:
- Nevezze át a rekordtípusban meghívott
Clonetagokat egy másik névre. A fordító aClonewithkifejezések másolási szemantikáját implementálja belsőleg, ezért a sajátClonetag deklarálása ütközik a szintetizált implementációval (CS8859). - Nevezze át a
recordtípust vagy aliast egy másik névre. Mivelrecorda környezetfüggő kulcsszó rekordtípusok deklarálásához használatos, a típus vagy aliasrecordelnevezése kétértelműséget eredményez, amely összezavarhatja a fordítót és a kódot olvasó fejlesztőket (CS8860).