Megosztás a következőn keresztül:


Rekorddeklarációk hibáinak és figyelmeztetéseinek elhárítása

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) Equals metódus, a deconstruct metódus, a GetHashCode, a EqualityContract tulajdonság és a op_Equality, op_Inequality operá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 a PrintMembers metódus elérhetőségét protected, amikor nem lezárt rekordosztályban deklarálja. A metódusnak protected kell 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 PrintMembers metódus private hozzá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 static mó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 EqualityContract tulajdonságnak System.Type értéket kell visszaadnia, és a Equals metódusnak bool é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 sealed mó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 virtual vagy override. 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 Deconstruct metó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ás ref struct tí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 new mó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ált Deconstruct metó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 GetHashCode metódust, valahányszor meghatároz egy Equals metó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. A with kifejezé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 object vagy 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 Clone tagokat egy másik névre. A fordító a Clonewith kifejezések másolási szemantikáját implementálja belsőleg, ezért a saját Clone tag deklarálása ütközik a szintetizált implementációval (CS8859).
  • Nevezze át a record típust vagy aliast egy másik névre. Mivel record a környezetfüggő kulcsszó rekordtípusok deklarálásához használatos, a típus vagy alias record elnevezése kétértelműséget eredményez, amely összezavarhatja a fordítót és a kódot olvasó fejlesztőket (CS8860).