Vyřešte chyby a upozornění u deklarací záznamů

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 with musí 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 ne­pře­pisuje po­žadovanou vlast­nost 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, vlastnosti EqualityContract nebo operátorů op_Equality a op_Inequality na public. 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 PrintMembers metody tak, aby protected byla deklarována v nezapečetěné třídě záznamů. Metoda musí být protected proto, že odvozené záznamy ji přepíšou tak, aby zahrnovaly své vlastní vlastnosti ve formátovaný výstup (CS8875).
  • Změňte přístupnost PrintMembers metody tak, aby private byla 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 static z 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 EqualityContract vlastnost musí vrátit System.Typea Equals metoda musí vrátit bool. 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).
  • sealed Odeberte 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 virtual nebo override v 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 object nebo ze základního typu záznamu. Například Equals metoda musí přepsat object.Equals, a GetHashCode musí přepsat object.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á EqualityContract vlastnost přepíše vlastnost základního záznamu EqualityContract . 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).
  • get Přidejte do EqualityContract vlastnosti 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á Deconstruct metoda 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 new modifiká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ší syntetizovanou Deconstruct metodu a porovnávání pozičních vzorů (CS8913).

Členové rovnosti

  • CS8851: typ definuje 'Equals', ale ne 'GetHashCode'
  • CS8857: Příjemce výrazu with musí 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 GetHashCode pokaždé, když definujete metodu Equals . 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 with tak, aby se jedná o typ záznamu nebo typ struktury. Výraz with vytvoří upravenou kopii pomocí konstruktoru kopírování record nebo sémantika kopírování hodnot pro struct typy (CS8858).
  • Ujistěte se, že příjemce výrazuwith nemá typ void. Výraz with vytvoří 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 object nebo 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 Clone v typu záznamu na něco jiného. Kompilátor používá Clone interně k implementaci sémantiky kopírování pro with výrazy, takže deklarování vlastního Clone člena koliduje s syntetizovanou implementací (CS8859).
  • Přejmenujte libovolný typ nebo alias pojmenovaný record na jiný název. Protože record je kontextové klíčové slovo používané k deklarování typů záznamů, pojmenování typu nebo aliasu record vytváří nejednoznačnost, která může zmást kompilátor i vývojáře, kteří čtou kód (CS8860).