Řešení chyb a upozornění souvisejících s deklaracemi atributů nebo použitím atributu v kódu

Tento článek se zabývá následujícími chybami kompilátoru:

  • CS0181: Parametr konstruktoru atributu má typ, což není platný typ parametru atributu
  • CS0243: Podmíněný atribut není platný pro metodu, protože jde o přetíženou metodu.
  • CS0404: Atribut není pro tento typ deklarace platný.
  • CS0415: Tento atribut je platný pouze u indexeru, který není explicitní deklarace člena rozhraní.
  • CS0416: Parametr typu: Argument atributu nemůže použít parametry typu.
  • CS0447: Atribut nelze použít s argumenty typu.
  • CS0577: Podmíněný atribut není platný, protože se jedná o konstruktor, destruktor, operátor, výraz lambda nebo explicitní implementaci rozhraní.
  • CS0578: Podmíněný atribut není pro funkci platný, protože jeho návratový typ není neplatný.
  • CS0579: Duplicitní atribut
  • CS0582: Podmíněný atribut není platný pro členy rozhraní.
  • CS0592: Atribut není pro tento typ deklarace platný. Platí pouze pro konkrétní deklarace.
  • CS0609: Nelze nastavit atribut u indexeru označeného jako override.
  • CS0616: Typ není třída atributu
  • CS0625: Pole instance v typech označených atributem StructLayout(LayoutKind.Explicit) musí mít atribut FieldOffset.
  • CS0629: Podmíněný člen 'member' nemůže implementovat člena rozhraní 'member základní třídy' v typu 'Název typu'.
  • CS0636: Atribut FieldOffset lze umístit pouze na členy typů označených StructLayout(LayoutKind.Explicit).
  • CS0637: Atribut FieldOffset není povolen pro statická pole nebo pole const.
  • CS0641: Tento atribut je platný pouze pro třídy odvozené ze System.Attribute'.
  • CS0646: Nelze zadat atribut DefaultMember u typu obsahujícího indexer.
  • CS0647: Chyba při generování atributu
  • CS0653: Nelze použít třídu atributu 'class', protože je abstraktní.
  • CS0657: Místo není platným místem atributu pro tuto deklaraci. Jsou uvedeny platné umístění atributů pro tuto deklaraci. Všechny atributy v tomto bloku budou ignorovány.
  • CS0658: Toto umístění není rozpoznaným umístěním atributu. Jsou uvedena platná umístění atributů pro tuto deklaraci. Všechny atributy v tomto bloku budou ignorovány.
  • CS0668: Dva indexery mají různé názvy; atribut IndexerName musí být použit se stejným názvem u každého indexeru v rámci typu.
  • CS0685: Podmíněný člen člen nemůže mít výstupní parametr.
  • CS0735: Neplatný typ zadaný jako argument pro atribut TypeForwardedTo
  • CS0739: Duplicitní typForwardedToAttribute
  • CS1608: Atribut RequiredAttribute není povolen u typů C#
  • CS1614: Název atributu je nejednoznačný. Použijte buď @name, nebo explicitně uveďte příponu Atribut.
  • CS1618: Nelze vytvořit delegáta s metodou, protože ona nebo metoda, kterou přepisuje, má atribut Conditional
  • CS1667: Atribut není platný u vlastností nebo přístupových objektů událostí. Platí pouze pro konkrétní deklarace.
  • CS1689: Atribut je platný pouze u metod nebo tříd atributů
  • CS7014: Atributy nejsou v tomto kontextu platné.
  • CS7046: Je nutné zadat parametr atributu.
  • CS7047: Je třeba zadat parametr atributu parameter1 nebo parameter2.
  • CS7067: Parametr konstruktoru atributu je volitelný, ale nebyla zadána žádná výchozí hodnota parametru.
  • CS8423: Atribut „attribute“ není u přístupových metod události platný. Je platný pouze pro deklarace typu „declaration“.
  • CS8783: Místní funkce "metoda" musí být statická, aby bylo možné použít podmíněný atribut
  • CS8959: CallerArgumentExpressionAttribute nelze použít, protože neexistují žádné standardní převody typu 1 na typ2
  • CS8960: CallerArgumentExpressionAttribute použitý u parametru nebude mít žádný vliv. Přepíše se atributem CallerLineNumberAttribute.
  • CS8961: CallerArgumentExpressionAttribute použitý u parametru nebude mít žádný vliv. Přepíše se atributem CallerFilePathAttribute.
  • CS8962: CallerArgumentExpressionAttribute použitý u parametru nebude mít žádný vliv. Přepíše se atributem CallerMemberNameAttribute.
  • CS8963: CallerArgumentExpressionAttribute použitý u parametru nebude mít žádný vliv. Použije se s neplatným názvem parametru.
  • CS8968: Argument typu atributu nemůže použít parametry typu
  • CS8970: Typ nelze v tomto kontextu použít, protože jej nelze reprezentovat v metadatech.
  • CS9331: Atribut nelze použít ručně.
  • CS9351: Použití atributu StructLayoutAttribute a ExtendedLayoutAttribute u stejného typu není povoleno.

Argumenty a parametry atributů

Při nesprávném použití argumentů nebo parametrů atributů se zobrazí následující chyby:

  • CS0181: Parametr konstruktoru atributu má typ, což není platný typ parametru atributu
  • CS0416: Parametr typu: Argument atributu nemůže použít parametry typu.
  • CS0447: Atribut nelze použít s argumenty typu.
  • CS0647: Chyba při generování atributu
  • CS7046: Je nutné zadat parametr atributu.
  • CS7047: Je třeba zadat parametr atributu parameter1 nebo parameter2.
  • CS7067: Parametr konstruktoru atributu je volitelný, ale nebyla zadána žádná výchozí hodnota parametru.
  • CS8968: Argument typu atributu nemůže použít parametry typu
  • CS8970: Typ nelze v tomto kontextu použít, protože jej nelze reprezentovat v metadatech.

Pokud chcete tyto chyby opravit, postupujte podle těchto pravidel:

  • Parametry konstruktoru atributů musí používat platné typy parametrů atributů (CS0181). Specifikace jazyka C# omezuje typy parametrů atributů na primitivní typy (bool, byte, char, double, float, int, long, shorta string), object, , System.Typevýčtové typy a jednorozměrná pole těchto typů. Ukazatele funkcí a jiné typy, které nelze reprezentovat v metadatech, nejsou platnými typy parametrů atributů.
  • Argumenty atributů musí být konstantní hodnoty kompilační doby, takže jako argumenty atributů nemůžete použít parametry typu (CS0416). Kompilátor musí přeložit argumenty atributů v době kompilace a parametry typu nejsou známé, dokud nebude vytvořen obecný typ.
  • Argumenty typu nelze použít u ne generického atributu (CS0447). Pokud není třída atributu obecná, její použití nemůže obsahovat argumenty typu v úhlových závorkách.
  • Všechny hodnoty předané konstruktoru atributů musí být správně naformátované a v platném rozsahu pro každý parametr (CS0647). Například GuidAttribute vyžaduje platný řetězec formátu GUID.
  • Při použití atributu (CS7046, CS7047) musíte zadat všechny požadované parametry atributu. Zkontrolujte podpis konstruktoru atributu, abyste zjistili, které parametry jsou povinné, a zadejte platné argumenty pro každý parametr.
  • Když definujete vlastní atribut s volitelnými parametry konstruktoru, zadejte výchozí hodnoty pro tyto parametry (CS7067). Použijte syntaxi parameterType parameterName = defaultValue v konstruktoru atributu, aby volající mohli tyto argumenty vynechat.
  • Argumenty obecného typu atributu musí být konkrétní typy, nikoli parametry typu (CS8968). Kompilátor musí plně určit argumenty obecného typu atributu v době kompilace, takže parametry otevřeného typu nejsou povoleny.
  • Typy používané jako argumenty atributů musí být reprezentovatelné v metadatech (CS8970). Některé vytvořené typy, například ty, které zahrnují dynamic nebo některé názvy prvků řazené kolekce členů, nelze zakódovat do metadat a nejsou povoleny jako argumenty typu atributu.

Další informace naleznete v části Atributy, Obecné typy a specifikace jazyka C#u atributů.

Poznámka:

CS0447 a CS0647 jsou zastaralé. Aktuální kompilátor tyto chyby nevygeneruje.

Požadavky na třídu atributů

Při definování tříd atributů, které nevyhovují požadovaným omezením, se zobrazí následující chyby:

  • CS0404: Atribut není pro tento typ deklarace platný.
  • CS0579: Duplicitní atribut
  • CS0616: Typ není třída atributu
  • CS0641: Tento atribut je platný pouze pro třídy odvozené ze System.Attribute'.
  • CS0653: Nelze použít třídu atributu 'class', protože je abstraktní.
  • CS1614: Název atributu je nejednoznačný. Použijte buď @name, nebo explicitně zahrňte příponu Atribut.

Pokud chcete tyto chyby opravit, postupujte podle těchto pravidel:

  • Použít atributy pouze na typy deklarací, které atribut AttributeUsageAttribute umožňuje (CS0404). AttributeTargets Zkontrolujte hodnotu zadanou v atributu AttributeUsage a zjistěte, které cíle jsou platné.
  • Pokud stejný atribut použijete více než jednou pro jeden cíl, odeberte duplikát nebo sadu AllowMultiple = true v atributu AttributeUsageAttribute (CS0579). Ve výchozím nastavení se atributy můžou na každém cíli zobrazovat jen jednou.
  • Typ použitý v syntaxi atributu musí dědit z System.Attribute (CS0616). Jako atributy lze použít pouze třídy odvozené z System.Attribute . Jiné typy způsobují tuto chybu i v případě, že mají podobný název.
  • Lze použít AttributeUsageAttribute pouze pro třídy odvozené od Attribute (CS0641). Atribut AttributeUsage řídí způsob použití jiných atributů a je sám omezen na třídy atributů.
  • Třídy atributů nemohou být abstract , protože kompilátor musí vytvořit instanci (CS0653). Odeberte modifikátor z atributové třídy, nebo vytvořte konkrétní třídu z abstraktního základu.
  • Pokud existují třídy obou ExampleExampleAttribute atributů, kompilátor nemůže určit, který [Example] z nich odkazuje (CS1614). Odlište pomocí [@Example] pro kratší název nebo [ExampleAttribute] pro delší název.

Další informace naleznete v tématu Vytváření vlastních atributů a oddíl specifikace jazyka C# u atributů.

Kontext umístění atributu

K následujícím chybám dochází při použití atributů v neplatných umístěních nebo použití nesprávných cílových specifikátorů:

  • CS0592: Atribut není pro tento typ deklarace platný. Platí pouze pro konkrétní deklarace.
  • CS0657: Toto umístění není platné pro atribut v této deklaraci. Seznam platných umístění atributů pro tuto deklaraci je uveden. Všechny atributy v tomto bloku budou ignorovány.
  • CS0658: Umístění není rozpoznáno jako umístění atributu. Jsou uvedena platná umístění atributů pro tuto deklaraci. Všechny atributy v tomto bloku budou ignorovány.
  • CS1667: Atribut není platný pro vlastnosti nebo přístupové metody událostí. Je platný pouze pro určité deklarace.
  • CS7014: Atributy nejsou v tomto kontextu platné.
  • CS8423: Atribut „attribute“ není u přístupových metod události platný. Je platný pouze u deklarací typu „declaration“.

Pokud chcete tyto chyby opravit, postupujte podle těchto pravidel. Další informace najdete v tématu Cíle atributů a část specifikace jazyka C# o specifikaci atributu.

  • Každý atribut AttributeUsageAttribute určuje, na které typy deklarací cílí. Atribut musíte použít pouze u těchto typů (CS0592). Například nelze použít atribut definovaný pomocí AttributeTargets.Interface na třídu.
  • Pokud použijete specifikátor cíle atributu, například method: nebo property:, specifikátor musí být platný pro deklaraci, kde se zobrazí (CS0657). Zkontrolujte chybovou zprávu a zjistěte, které cílové specifikátory jsou pro konkrétní deklaraci povolené.
  • Specifikátor cíle atributu, který jste použili, není rozpoznaný specifikátor (CS0658). Mezi platné specifikátory patří assembly:, , module:type:method:property:field:, event:, param:, a .return:
  • Některé atributy, například ObsoleteAttribute a CLSCompliantAttribute, nejsou platné u vlastností nebo přístupových objektů událostí (CS1667). Přesuňte atribut z přístupového objektu do samotné vlastnosti nebo deklarace události.
  • Atributy se můžou objevit pouze u prvků programu, které je podporují (CS7014). Pokud používáte atributy na úrovni sestavení nebo na úrovni modulu, použijte assembly: specifikátory nebo module: cílové specifikátory a umístěte je do horní části souboru.
  • Atributy událostí add a remove přístupových objektů nejsou povolené (CS8423). Použijte atribut u deklarace události nebo použijte platný cíl, například method: nebo param:, u deklarace, která tento cíl podporuje.

Předdefinované atributy

Při nesprávném použití konkrétních předdefinovaných atributů .NET dochází k následujícím chybám:

  • CS0415: Tento atribut je platný pouze u indexeru, který není explicitní deklarace člena rozhraní.
  • CS0609: Atribut nelze nastavit u indexeru, který je označen jako 'override'.
  • CS0625: Pole instance v typech označených atributem StructLayout(LayoutKind.Explicit) musí mít atribut FieldOffset.
  • CS0636: Atribut FieldOffset lze umístit pouze na členy typů označených StructLayout(LayoutKind.Explicit).
  • CS0637: Atribut FieldOffset není povolen pro statická pole nebo pole const.
  • CS0646: Nelze zadat atribut DefaultMember u typu obsahujícího indexer.
  • CS0668: Dva indexery mají různé názvy; atribut IndexerName musí být použit se stejným názvem u každého indexeru v rámci typu.
  • CS0735: Neplatný typ zadaný jako argument pro atribut TypeForwardedTo
  • CS0739: Duplicitní TypeForwardedToAttribute
  • CS1608: Atribut RequiredAttribute není povolen u typů C#
  • CS9331: Atribut nelze použít ručně.
  • CS9351: Použití atributu StructLayoutAttribute a ExtendedLayoutAttribute u stejného typu není povoleno.

Pokud chcete tyto chyby opravit, postupujte podle těchto pravidel. Další informace naleznete v tématu Indexery, typy struktur, TypeForwardedToAttribute, nebezpečný kód a ukazatele a volání platformy (P/Invoke).

  • Můžete použít IndexerNameAttribute pouze pro indexery, které nejsou explicitní deklarace členů rozhraní (CS0415). Odeberte atribut z explicitních indexerů rozhraní, protože rozhraní již definuje název indexeru.
  • Na indexery označené pomocí IndexerName nelze použít override, protože indexery přepsané pomocí dědí jejich název ze základní třídy (CS0609). Odeberte atribut IndexerName z přepisovacího indexeru.
  • Každé pole instance v typu označeném StructLayout(LayoutKind.Explicit) musí mít FieldOffsetAttribute (CS0625). Explicitní rozložení vyžaduje, abyste pro každé pole instance zadali bajtový posun.
  • FieldOffsetAttribute můžete umístit pouze na členy typů, u nichž je StructLayoutAttribute nastaveno na LayoutKind.Explicit (CS0636). Přidejte atribut StructLayout do deklarace typu, který obsahuje.
  • Atribut FieldOffset není povolen pro static pole nebo const pole, protože explicitní rozložení platí jenom pro pole instance (CS0637). FieldOffset Odeberte atribut ze statického pole nebo z pole const.
  • Nelze použít DefaultMemberAttribute u typu, který už obsahuje indexer, protože kompilátor automaticky definuje výchozí člen pro typy s indexery (CS0646). Odeberte atribut DefaultMember.
  • Všechny IndexerNameAttribute atributy v rámci typu musí určovat stejný název (CS0668). Změňte názvy tak, aby odpovídaly, protože modul runtime používá jeden název pro všechny indexery typu.
  • Pro TypeForwardedToAttribute je nutné jako argument zadat negenerický, nevnořený, neukazatelový typ ani typ pole (CS0735). Platné cíle předávání jsou pouze pojmenované typy nejvyšší úrovně.
  • Sestavení může mít pouze jeden TypeForwardedToAttribute pro každý externí typ (CS0739). Vyhledejte a odeberte duplicitní TypeForwardedTo deklaraci.
  • Nemůžete použít typy RequiredAttributeAttribute definované v jazyce C# (CS1608). Tento atribut je vyhrazený pro jiné jazyky, které potřebují vynutit kompilátory, aby vyžadovaly konkrétní funkci.
  • Některé atributy jsou vyhrazené pro kompilátor a nelze je použít ručně ve zdrojovém kódu (CS9331). Nahraďte atribut ekvivalentní syntaxí jazyka C#, která způsobí, že ho kompilátor vygeneruje.
  • Nepoužívejte současně StructLayoutAttribute a ExtendedLayoutAttribute pro stejný typ (CS9351). Tyto dva atributy rozložení představují vzájemně se vylučující strategie rozložení v rámci aktualizovaného modelu bezpečnosti paměti: explicitní rozložení vyžaduje FieldOffset pro každé pole instance, zatímco rozšířené rozložení umožňuje modulu runtime zvolit posuny polí, zatímco stále vyžadují, aby každé pole bylo označeno safe nebo unsafe. Odeberte jeden ze dvou atributů z deklarace typu.

Použití podmíněného atributu

Při použití ConditionalAttribute způsobů, které porušují omezení použití, se zobrazí následující chyby:

  • CS0243: Podmíněný atribut není platný pro 'metodu', protože se jedná o přepsanou metodu.
  • CS0577: Podmíněný atribut není platný, protože se jedná o konstruktor, destruktor, operátor, výraz lambda nebo explicitní implementaci rozhraní.
  • CS0578: Podmíněný atribut není pro funkci platný, protože jeho návratový typ není neplatný.
  • CS0582: Podmíněný atribut není platný pro členy rozhraní.
  • CS0629: Podmíněný člen 'member' nemůže implementovat rozhraní 'člen' v typu 'Název typu'.
  • CS0685: Podmíněný člen 'member' nemůže mít výstupní parametr.
  • CS1618: Nelze vytvořit delegáta s metodou, protože metoda nebo některá z metod, které přepisuje, má atribut Conditional
  • CS1689: Atribut je platný pouze u metod nebo tříd atributů
  • CS8783: Místní funkce "metoda" musí být statická, aby bylo možné použít podmíněný atribut

Pokud chcete tyto chyby opravit, postupujte podle těchto pravidel. Další informace naleznete v tématu ConditionalAttribute, Podmíněné metody a Atributy.

  • Kompilátor svazuje volání na deklaraci základní metody, nikoli na přepsanou, takže nelze použít atribut Conditional na metody označené jako override (CS0243). Odeberte atribut Conditional z přetížené metody nebo odeberte klíčové slovo override.
  • Atribut Conditional není platný pro konstruktory, finalizátory, operátory, výrazy lambda nebo explicitní implementace rozhraní (CS0577). Tyto typy členů nelze podmíněně vynechat, protože mají požadované role v životním cyklu nebo smlouvě typu.
  • Podmíněné metody musí vrátit void , protože kompilátor by mohl volání zcela vynechat a volajícímu by nebyla k dispozici žádná návratová hodnota (CS0578). Změňte návratový typ metody na voidnebo odeberte Conditional atribut.
  • Členy rozhraní nemohou být podmíněné, protože musí být implementovány všechny členy rozhraní (CS0582). Odeberte atribut Conditional z deklarace člena rozhraní.
  • Metody, které implementují členy rozhraní, nemohou být podmíněné, protože kontrakt rozhraní vyžaduje, aby byly přítomny ve všech buildech (CS0629). Odeberte atribut Conditional z implementační metody.
  • Podmíněné metody nemohou mít out parametry, protože out hodnota proměnné by nebyla definována, když kompilátor vynechá volání metody (CS0685). Odeberte out parametry z metody nebo odeberte Conditional atribut.
  • Delegáta, který odkazuje na podmíněnou metodu, nelze vytvořit, protože tato metoda nemusí existovat v buildech, kde není definovaný symbol podmínky (CS1618). Odeberte atribut Conditional z metody nebo jej nepoužívejte jako cíl delegáta.
  • Atribut Conditional je platný pouze pro metody a třídy atributů (CS1689). Není platný u jiných typů deklarací, jako jsou třídy, struktury nebo rozhraní bez atributů.
  • Místní funkce musí být deklarována static tak, aby používala Conditional atribut (CS8783). Nestatické místní funkce zaznamenávají stav z uzavřené metody a kompilátor nemůže bezpečně vynechat volání, které by mohlo zahrnovat zachycené proměnné. static Přidejte modifikátor do místní funkce nebo odeberte [Conditional] atribut.

Použití atributu CallerArgumentExpression

Při nesprávném použití CallerArgumentExpressionAttribute nebo konfliktu s jinými atributy informací o volajícím dojde k následujícím chybám:

  • CS8959: CallerArgumentExpressionAttribute nelze použít, protože neexistují žádné standardní převody typu 1 na typ2
  • CS8960: CallerArgumentExpressionAttribute použitý u parametru nebude mít žádný vliv. Přepíše se atributem CallerLineNumberAttribute.
  • CS8961: CallerArgumentExpressionAttribute použitý u parametru nebude mít žádný vliv. Přepíše se atributem CallerFilePathAttribute.
  • CS8962: CallerArgumentExpressionAttribute použitý u parametru nebude mít žádný vliv. Přepíše se atributem CallerMemberNameAttribute.
  • CS8963: CallerArgumentExpressionAttribute použitý u parametru nebude mít žádný vliv. Použije se s neplatným názvem parametru.

Pokud chcete tyto chyby opravit, postupujte podle těchto pravidel. Další informace naleznete v tématu Atributy informací volajícího a CallerArgumentExpressionAttribute.

  • Parametr zdobený musí mít typ CallerArgumentExpression nebo typ se standardním převodem string z string, protože atribut vloží string reprezentaci výrazu argumentu volajícího (CS8959). Změňte typ parametru na string nebo kompatibilní typ.
  • Atribut CallerArgumentExpression nemá žádný vliv na parametr, který má CallerLineNumberAttributetaké , CallerFilePathAttributenebo CallerMemberNameAttribute (CS8960, CS8961, CS8962). Tyto atributy informací o volajícím mají přednost, proto atribut z parametru odeberte CallerArgumentExpression .
  • Argument řetězce předaný konstruktoru CallerArgumentExpression musí odpovídat názvu jiného parametru ve stejném podpisu metody (CS8963). Pokud je název parametru chybně napsaný nebo odkazuje na neexistující parametr, atribut nemá žádný vliv.