Ř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.
  • 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
  • CS8783: Místní funkce "metoda" musí být statická, aby bylo možné použít podmíněný atribut
  • CS8970: Typ nelze v tomto kontextu použít, protože jej nelze reprezentovat v metadatech.
  • CS9331: Atribut nelze použít ručně.

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é.

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.

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ě.

Pokud chcete tyto chyby opravit, postupujte podle těchto pravidel. Další informace najdete v tématu Indexery, TypeForwardedToAttribute 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.

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.