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 jazyka C# generuje chyby a upozornění při zneužití typů záznamů. Typy záznamů poskytují předdefinované členy, které implementují rovnost založenou na hodnotách. Tato diagnostika vám pomůže dodržovat pravidla pro deklarování a používání typů záznamů.
- CS8851: Typ definuje "Equals", ale ne GetHashCode
-
CS8857: Příjemce výrazu
withmusí mít jiný typ než void. - CS8858: Typ příjemce není platným typem záznamu a není typem struktury.
- CS8859: Členové s názvem Clone jsou v záznamech zakázáni.
- CS8860: Typy a aliasy by neměly mít název "record".
- CS8864: Záznamy mohou dědit pouze z objektu nebo jiného záznamu.
- CS8865: Pouze záznamy mohou dědit ze záznamů.
- CS8866: Člen záznamu "member" musí být čitelnou vlastností instance nebo pole určitého typu, aby odpovídal pozičnímu parametru "parameter".
- CS8869: 'member' nedefinuje očekávanou metodu z 'object'.
- CS8870: Člen nelze zapečetit, protože obsahující záznam není zapečetěn.
- CS8871: 'member' nepřepisuje očekávanou metodu z typu.
- CS8872: Člen musí povolit přepsání, protože obsahující záznam není zapečetěn.
- CS8873: Člen záznamu 'member' musí být veřejný.
- CS8874: Člen záznamu 'member' musí vrátit 'type'.
- CS8875: Člen záznamu "member" musí být chráněn.
- CS8876: Prvek nepřepisuje požadovanou vlastnost z typu.
- CS8877: Člen záznamu 'member' nemusí být statický.
- CS8879: Položka záznamu "member" musí být soukromá.
- CS8906: Záznam vlastnosti rovnosti "člen" musí mít přístupové objekty get.
- CS8908: Typ "type" nelze použít pro pole záznamu.
- CS8913: Poziční člen 'member' nalezen odpovídající tomuto parametru je skrytý.
Kromě toho se tento článek věnuje následujícímu upozornění:
- CS8907: Parametr name je nepřečtený. Zapomněli jste ji použít k inicializaci vlastnosti s tímto názvem?
Syntetizované členské podpisy
- CS8869: Členská funkce nepřekrývá očekávanou metodu z objektu.
- CS8870: Člen nelze zapečetit, protože obsahující záznam není zapečetěn.
- CS8871: Člen nepřepíše očekávanou metodu z typu.
- CS8872: Člen musí povolit přepsání, protože obsahující záznam není zapečetěn.
- CS8873: Člen záznamu 'member' musí být veřejný.
- CS8874: Člen záznamu 'member' musí vrátit 'type'.
- CS8875: Člen záznamu "member" musí být chráněn.
- CS8876: člen nepřepisuje očekávanou vlastnost z typu.
- CS8877: Člen záznamu 'member' nesmí být statický.
- CS8879: Položka záznamu "member" musí být soukromá.
- CS8906: Záznam vlastnosti rovnosti "člen" musí mít přístupové objekty get.
Když explicitně deklarujete člena, který by kompilátor jinak syntetizoval pro typ záznamu, musí deklarace odpovídat očekávanému podpisu, přístupnosti a modifikátorům. Kompletní pravidla najdete ve specifikaci záznamů ve specifikaci jazyka C#.
Pokud chcete tyto chyby opravit, použijte u explicitně deklarovaných členů záznamů následující změny:
- Změňte přístupnost metody
Equals,GetHashCode,ToString, dekonstrukční metody, vlastnostiEqualityContractnebo operátorůop_Equalityaop_Inequalitynapublic. Kompilátor vyžaduje, aby tyto členy byly veřejně přístupné, aby rovnost založená na hodnotách správně fungovala ve všech kontextech volání (CS8873). - Změňte přístupnost
PrintMembersmetody tak, abyprotectedbyla deklarována v nezapečetěné třídě záznamů. Metoda musí býtprotectedproto, že odvozené záznamy ji přepíšou tak, aby zahrnovaly své vlastní vlastnosti ve formátovaný výstup (CS8875). - Změňte přístupnost
PrintMembersmetody tak, abyprivatebyla deklarována v zapečetěné třídě záznamů nebo ve struktuře záznamu. Vzhledem k tomu, že neexistuje žádný odvozený typ, nemusí být metoda přístupná mimo typ (CS8879). - Odeberte modifikátor
staticz jakéhokoli explicitně deklarovaného syntetizovaného členu. Syntetizované členy pracují s konkrétními instancemi záznamů a implementují chování, jako je porovnání rovnosti, formátování a kopírování, takže musí být členy instance (CS8877). - Změňte návratový typ člena tak, aby odpovídal typu, který kompilátor očekává. Například
EqualityContractvlastnost musí vrátitSystem.TypeaEqualsmetoda musí vrátitbool. Kompilátor spoléhá na tyto přesné návratové typy k vygenerování správného kódu pro rovnost a další syntetizované chování (CS8874). -
sealedOdeberte modifikátor z jakéhokoli explicitně deklarovaného syntetizovaného členu v nezapečetěném záznamu. Odvozené záznamy musí být schopné tyto členy přepsat, aby poskytovaly vlastní logiku rovnosti a formátování na základě hodnot (CS8870). - Deklarujte explicitně poskytnuté syntetizované členy jako
virtualnebooverridev nezapečetěném záznamu. Kompilátor vyžaduje, aby tyto členy umožnily přepsání, aby odvozené záznamy v hierarchii dědičnosti mohly přizpůsobit své chování (CS8872). - Ujistěte se, že explicitně deklarovaný člen přepíše očekávanou metodu z
objectnebo ze základního typu záznamu. NapříkladEqualsmetoda musí přepsatobject.Equals, aGetHashCodemusí přepsatobject.GetHashCode. Kompilátor zkontroluje, zda se tito členové účastní správného řetězce přepsání, aby rovnost na základě hodnot a další syntetizované chování správně fungovaly v hierarchii typů (CS8869, CS8871). - Ujistěte se, že explicitně deklarovaná
EqualityContractvlastnost přepíše vlastnost základního záznamuEqualityContract. Kompilátor spoléhá na řetězec překrytí pro kontrakt rovnosti k rozlišení datových typů během spuštění ve hierarchii dědičnosti (CS8876). -
getPřidejte doEqualityContractvlastnosti přístupové objekty. Kompilátor čte kontrakt rovnosti za běhu, aby zjistil, zda jsou dvě instance záznamů stejného typu, takže vlastnost musí být čitelná (CS8906).
Poziční členy
- CS8866: Člen záznamu "member" musí být čitelná vlastnost instance nebo pole typu type 'type', aby se shodovaly s pozičním parametrem "parameter".
- CS8907: Parametr name je nepřečtený. Zapomněli jste ji použít k inicializaci vlastnosti s tímto názvem?
- CS8908: Typ "type" nelze použít pro pole záznamu.
- CS8913: Byl nalezen poziční prvek 'member', který odpovídá tomuto parametru, ale je skrytý.
Když deklarujete poziční záznam, kompilátor syntetizuje vlastnosti, které odpovídají jednotlivým pozičním parametrům. Tato diagnostika indikuje, že vaše explicitní deklarace jsou v konfliktu s těmito syntetizovanými vlastnostmi. Kompletní pravidla najdete ve specifikaci záznamů ve specifikaci jazyka C#.
Pokud chcete tyto chyby opravit, použijte u deklarací pozičních záznamů následující změny:
- Změňte libovolný explicitně deklarovaný člen, který odpovídá pozičnímu parametru, aby se jedná o čitelný vlastnost instance nebo pole se stejným typem jako parametr. Kompilátor potřebuje, aby byl člen čitelný a kompatibilní s typem, aby syntetizovaná
Deconstructmetoda a porovnávání pozičních vzorů měly správný přístup k hodnotě (CS8866). - Při zadání explicitního konstruktoru se ujistěte, že každý poziční parametr inicializuje odpovídající vlastnost v těle konstruktoru. Kompilátor vyvolá upozornění při nepoužívaném parametru, protože obvykle označuje překlep nebo neshodu mezi názvem parametru a názvem vlastnosti, což by ponechá vlastnost neinicializovaná (CS8907).
- Změňte typ pole deklarovaného v záznamu na typ, který je v tomto kontextu platný. Některé typy, jako
nebo jiné typy , nelze použít jako pole v záznamu, protože typy záznamů vyžadují, aby všechna pole byla kompatibilní s alokací na haldě a hodnotovou rovností ( CS8908 ). - Odeberte
newmodifikátor ze člena v odvozeném záznamu, který skrývá poziční člen základního záznamu. Pokud je poziční člen skrytý, kompilátor nemůže odpovídat pozičnímu parametru s odpovídající vlastností, která přeruší syntetizovanouDeconstructmetodu a porovnávání pozičních vzorů (CS8913).
Členové rovnosti
- CS8851: typ definuje 'Equals', ale ne 'GetHashCode'
-
CS8857: Příjemce výrazu
withmusí mít jiný typ než void. - CS8858: Typ příjemce není platným typem záznamu a není typem struktury.
Typy záznamů poskytují integrovanou rovnost založenou na hodnotách. Tato diagnostika vzniká, když vaše deklarace kolidují se smlouvou o rovnosti. Úplná pravidla rovnosti najdete v tématu Porovnání rovnosti.
Pokud chcete tyto chyby opravit, použijte následující změny:
- Přidejte metodu
GetHashCodepokaždé, když definujete metoduEquals. Kontrakt rovnosti vyžaduje, aby objekty, které se považují za rovné, vytvořil stejný hashovací kód, takže kompilátor vynucuje, aby tyto dvě metody byly vždy definovány společně (CS8851). - Změňte příjemce výrazu
withtak, aby se jedná o typ záznamu nebo typ struktury. Výrazwithvytvoří upravenou kopii pomocí konstruktoru kopírovánírecordnebo sémantika kopírování hodnot prostructtypy (CS8858). - Ujistěte se, že příjemce výrazu
withnemá typ void. Výrazwithvytvoří novou kopii příjemce, takže příjemce musí vyhodnotit hodnotu, kterou lze zkopírovat (CS8857).
Dědičnost záznamů
- CS8864: Záznamy mohou dědit pouze z objektu nebo jiného záznamu
- CS8865: Pouze záznamy mohou dědit ze záznamů.
Typy tříd záznamů se řídí konkrétními pravidly dědičnosti . Kompletní pravidla najdete ve specifikaci záznamů ve specifikaci jazyka C#.
Pokud chcete tyto chyby opravit, použijte následující změny:
- Změňte základní typ třídy záznamu tak, aby dědila z
objectnebo z jiné třídy záznamů. Typy záznamů spoléhají na syntetizované členy kompilátoru pro rovnost a kopírování, které jsou kompatibilní pouze s jinými typy záznamů, takže kompilátor neumožňuje dědit záznam z jiné třídy záznamů (CS8864). - Změňte třídu, která není třídou záznamů a která dědí z třídy záznamů, aby byla deklarována jako třída záznamů. Vzhledem k tomu, že typy záznamů syntetizují rovnost, klonování a další členy, které závisí na konzistentním řetězu dědičnosti, kompilátor vyžaduje, aby každý typ v hierarchii byl třída záznamů (CS8865). Typy struktury záznamů se nemůžou účastnit hierarchií dědičnosti nad rámec implementace rozhraní.
Názvy rezervovaných členů
- CS8859: Členové s názvem Clone jsou v záznamech zakázáni.
- CS8860: Typy a aliasy by neměly mít název "record".
Kompilátor si vyhrazuje určité názvy pro použití s typy záznamů. Kompletní pravidla najdete ve specifikaci záznamů ve specifikaci jazyka C#.
Pokud chcete tyto chyby opravit, použijte následující změny:
- Přejmenujte libovolného člena nazvaného
Clonev typu záznamu na něco jiného. Kompilátor používáCloneinterně k implementaci sémantiky kopírování prowithvýrazy, takže deklarování vlastníhoClonečlena koliduje s syntetizovanou implementací (CS8859). - Přejmenujte libovolný typ nebo alias pojmenovaný
recordna jiný název. Protožerecordje kontextové klíčové slovo používané k deklarování typů záznamů, pojmenování typu nebo aliasurecordvytváří nejednoznačnost, která může zmást kompilátor i vývojáře, kteří čtou kód (CS8860).