Attribútumdeklarációkkal vagy attribútumhasználattal kapcsolatos hibák és figyelmeztetések elhárítása a kódban

Ez a cikk a következő fordítóhibákat ismerteti:

  • CS0181: Az attribútumkonstruktor paraméter típusa nem érvényes attribútumparaméter-típus
  • CS0243: A feltételes attribútum érvénytelen a metóduson, mert felülbírálási módszer.
  • CS0404: Az attribútum nem érvényes ebben a deklarációtípusban.
  • CS0415: Ez az attribútum csak olyan indexelőn érvényes, amely nem explicit felülettag-deklaráció.
  • CS0416: "típusparaméter": egy attribútumargumentum nem használhat típusparamétereket.
  • CS0447: Az attribútum nem használható típusargumentumokkal.
  • CS0577: A feltételes attribútum érvénytelen, mert konstruktor, destruktor, operátor, lambda kifejezés vagy explicit felületi implementáció.
  • CS0578: A feltételes attribútum érvénytelen a függvényen, mert a visszatérési típusa nem érvénytelen.
  • CS0579: Duplikált attribútum
  • CS0582: A feltételes attribútum nem érvényes a felülettagokon.
  • CS0592: Az attribútum nem érvényes ebben a deklarációtípusban. Ez csak adott deklarációkra érvényes.
  • CS0609: Nem állítható be az attribútum egy felülírással megjelölt indexelő tulajdonságon.
  • CS0616: A típus nem attribútumosztály
  • CS0625: A StructLayout(LayoutKind.Explicit) jelöléssel ellátott típusokban lévő példánymezőknek rendelkezniük kell FieldOffset attribútummal.
  • CS0629: A feltételes tag "tag" nem tudja implementálni az "alaposztály tag" illesztőtagot a típusnév típusában.
  • CS0636: A FieldOffset attribútum csak a StructLayout(LayoutKind.Explicit) elemekkel megjelölt típusok tagjaira helyezhető.
  • CS0637: A FieldOffset attribútum statikus vagy const mezőkön nem engedélyezett.
  • CS0641: Ez az attribútum csak a System.Attribútumból származtatott osztályokra érvényes.
  • CS0646: Nem adható meg a DefaultMember attribútum egy indexelőt tartalmazó típuson.
  • CS0647: Hibát okozó attribútum
  • CS0653: Az "osztály" attribútumosztály nem alkalmazható, mert absztrakt.
  • CS0657: A hely nem érvényes attribútumhely a deklarációhoz. A deklaráció érvényes attribútumhelyei szerepelnek a listában. A blokk összes attribútuma figyelmen kívül lesz hagyva.
  • CS0658: A hely nem felismert attribútumhely. A deklaráció érvényes attribútumhelyei szerepelnek a listában. A blokk összes attribútuma figyelmen kívül lesz hagyva.
  • CS0668: Két indexelő neve eltérő; az IndexerName attribútumot azonos névvel kell használni minden indexelőn egy típuson belül
  • CS0685: A feltételes tag "tag" nem rendelkezhet kimenő paramétersel.
  • CS0735: A TypeForwardedTo attribútum argumentumaként megadott típus érvénytelen
  • CS0739: Duplicate TypeForwardedToAttribute
  • CS1608: A RequiredAttribute attribútum nem engedélyezett C#-típusok esetén
  • CS1614: Az attribútum neve nem egyértelmű. Használja a "@name" szöveget, vagy explicit módon adja meg az "Attribútum" utótagot.
  • CS1618: Nem hozható létre delegált egy metódussal, mert a metódus vagy a felülbírált metódus feltételes attribútummal rendelkezik
  • CS1667: Az attribútum nem érvényes a tulajdonság- vagy eseménykiegészítőkre. Ez csak adott deklarációkra érvényes.
  • CS1689: Az attribútum csak metódusokon vagy attribútumosztályokon érvényes
  • CS7014: Az attribútumok ebben a környezetben nem érvényesek.
  • CS7046: Attribútumparamétert kell megadni.
  • CS7047: A "parameter1" vagy a "parameter2" attribútumparamétert meg kell adni.
  • CS7067: Az attribútumkonstruktor paraméter nem kötelező, de nincs megadva alapértelmezett paraméterérték.
  • CS8959: A CallerArgumentExpressionAttribute nem alkalmazható, mert nincs szabványos átalakítás az 1. típusról a 2. típusra
  • CS8960: A paraméterre alkalmazott CallerArgumentExpressionAttribute függvénynek nincs hatása. Ezt a CallerLineNumberAttribute felülbírálja.
  • CS8961: A paraméterre alkalmazott CallerArgumentExpressionAttribute nem lesz hatással. Ezt felülbírálja a CallerFilePathAttribute.
  • CS8962: A paraméterre alkalmazott CallerArgumentExpressionAttribute függvénynek nincs hatása. Ezt felülbírálja a CallerMemberNameAttribute.
  • CS8963: A paraméterre alkalmazott CallerArgumentExpressionAttribute függvénynek nincs hatása. Érvénytelen paraméternévvel alkalmazza a rendszer.
  • CS8968: Egy attribútumtípus argumentuma nem használhat típusparamétereket
  • CS8970: Ebben a környezetben nem használható típus, mert nem jeleníthető meg metaadatokban.
  • CS9331: Az attribútum nem alkalmazható manuálisan.

Attribútumargumentumok és paraméterek

Az attribútumargumentumok vagy paraméterek helytelen használata esetén a következő hibák jelennek meg:

  • CS0181: Az attribútumkonstruktor paraméter típusa nem érvényes attribútumparaméter-típus
  • CS0416: "típusparaméter": egy attribútumargumentum nem használhat típusparamétereket.
  • CS0447: Az attribútum nem használható típusargumentumokkal.
  • CS0647: Hiba történt az attribútum kibocsátásakor
  • CS7046: Attribútumparamétert kell megadni.
  • CS7047: A "parameter1" vagy a "parameter2" attribútumparamétert meg kell adni.
  • CS7067: Az attribútumkonstruktor paraméter nem kötelező, de nincs megadva alapértelmezett paraméterérték.
  • CS8968: Egy attribútumtípus argumentuma nem használhat típusparamétereket
  • CS8970: Ebben a környezetben nem használható típus, mert nem jeleníthető meg metaadatokban.

A hibák kijavításához kövesse az alábbi szabályokat:

  • Az attribútumkonstruktor paramétereinek érvényes attribútumparaméter-típusokat (CS0181) kell használniuk. A C#-nyelv specifikációja az attribútumparaméter-típusokat primitív típusokra (bool, , byte, chardouble, float, intlong, shortés string), object, System.Typeszámtípusokra és egydimenziós tömbökre korlátozza. A függvénymutatók és a metaadatokban nem ábrázolható egyéb típusok érvénytelen attribútumparaméter-típusok.
  • Az attribútumargumentumoknak fordítási idejű állandó értékeknek kell lenniük, ezért nem használhat típusparamétereket attribútumargumentumként (CS0416). A fordítónak fordításkor fel kell oldania az attribútumargumentumokat, és a típusparaméterek csak az általános típus létrehozása után lesznek ismertek.
  • Nem alkalmazhat típusargumentumokat nem általános attribútumokra (CS0447). Ha egy attribútumosztály nem általános, a használata nem tartalmazhat típusargumentumokat szögletes zárójelekben.
  • Az attribútumkonstruktornak átadott összes értéket megfelelően kell formázni, és az egyes paraméterek (CS0647) érvényes tartományán belül kell lennie. Például egy érvényes GUID formátumú sztringre GuidAttribute van szükség.
  • Az attribútum alkalmazásakor meg kell adnia az összes szükséges attribútumparamétert (CS7046, CS7047). Ellenőrizze az attribútum konstruktor-aláírását annak meghatározásához, hogy mely paraméterek kötelezőek, és adjon meg érvényes argumentumokat az egyes paraméterekhez.
  • Ha egyéni attribútumot határoz meg opcionális konstruktorparaméterekkel, adja meg a paraméterek alapértelmezett értékeit (CS7067). Használja a szintaxist parameterType parameterName = defaultValue az attribútumkonstruktorban, hogy a hívók kihagyhassák ezeket az argumentumokat.
  • Az általános attribútumtípus-argumentumoknak konkrét típusoknak kell lenniük, nem pedig típusparamétereknek (CS8968). A fordítónak teljes mértékben meg kell határoznia az általános attribútumtípus-argumentumokat fordításkor, ezért a nyitott típusparaméterek nem engedélyezettek.
  • Az attribútumargumentumként használt típusoknak a metaadatokban (CS8970) ábrázolhatóknak kell lenniük. Egyes felépített típusok, például azokat, amelyek magukban foglalnak dynamic vagy bizonyos vonáselemneveket, nem kódolhatók metaadatokba, és attribútumtípus-argumentumként nem használhatók.

További információ: Attribútumok, Általános adatok és A C# nyelv specifikációja szakasz az attribútumokról.

Megjegyzés:

A CS0447 és a CS0647 elavult. Az aktuális fordító nem bocsát ki ilyen hibákat.

Attribútumosztály követelményei

A következő hibák jelennek meg, amikor olyan attribútumosztályokat határoz meg, amelyek nem felelnek meg a szükséges korlátozásoknak:

  • CS0404: Az attribútum nem érvényes ebben a deklarációtípusban.
  • CS0579: Duplikált attribútum
  • CS0616: A típus nem attribútumosztály
  • CS0641: Ez az attribútum csak a System.Attribútumból származtatott osztályokra érvényes.
  • CS0653: Az "osztály" attribútumosztály nem alkalmazható, mert absztrakt.
  • CS1614: Az attribútum neve nem egyértelmű. Használja a "@name" szöveget, vagy explicit módon adja meg az "Attribútum" utótagot.

A hibák kijavításához kövesse az alábbi szabályokat:

  • Attribútumok csak az attribútum AttributeUsageAttribute által engedélyezett deklarációtípusokra alkalmazhatók (CS0404). Ellenőrizze az AttributeTargets attribútumban AttributeUsage megadott értéket, és ellenőrizze, hogy mely célok érvényesek.
  • Ha ugyanazt az attribútumot többször alkalmazza egyetlen célhelyre, távolítsa el a duplikált értéket, vagy állítsa be AllowMultiple = true az attribútumban AttributeUsageAttribute (CS0579). Alapértelmezés szerint az attribútumok csak egyszer jelenhetnek meg minden célhelyen.
  • Az attribútumszintaxisban használt típusnak a System.Attribute kell örökölnie. Attribútumként csak a származtatott System.Attribute osztályok használhatók. Más típusok akkor is okozhatják ezt a hibát, ha hasonló nevűek.
  • A AttributeUsageAttribute csak az Attribute osztályokra alkalmazható, amelyek a CS0641-ből származnak. Az AttributeUsage attribútum szabályozza az egyéb attribútumok használatát, és önmagában az attribútumosztályokra korlátozódik.
  • Az attribútumosztályok nem lehetnek abstract , mert a fordítónak példányosítania kell őket (CS0653). Távolítsa el a abstract módosítót az attribútumosztályból, vagy származtatott egy konkrét osztályt az absztrakt alapból.
  • Ha mindkét Example és ExampleAttribute attribútumosztály létezik, a fordító nem tudja meghatározni, hogy melyikre [Example] hivatkozik (CS1614). Használja a [@Example] jelölést a rövidebb névhez, vagy a [ExampleAttribute] jelölést a hosszabb névhez az egyértelműség érdekében.

További információ: Egyéni attribútumok létrehozása és az attribútumok C# nyelvspecifikációs szakasza.

Attribútum helyének környezete

Az alábbi hibák akkor fordulnak elő, ha attribútumokat alkalmaz érvénytelen helyeken, vagy helytelen céljelölőket használ:

  • CS0592: Az attribútum nem érvényes ebben a deklarációtípusban. Ez csak adott deklarációkra érvényes.
  • CS0657: A hely nem érvényes attribútumhely a deklarációhoz. A deklaráció érvényes attribútumhelyei szerepelnek a listában. A blokk összes attribútuma figyelmen kívül lesz hagyva.
  • CS0658: A hely nem felismert attribútumhely. A deklaráció érvényes attribútumhelyei szerepelnek a listában. A blokk összes attribútuma figyelmen kívül lesz hagyva.
  • CS1667: Az attribútum nem érvényes a tulajdonság- vagy eseménykiegészítőkre. Ez csak adott deklarációkra érvényes.
  • CS7014: Az attribútumok ebben a környezetben nem érvényesek.

A hibák kijavításához kövesse az alábbi szabályokat. További információ: Attribútumcélok és az attribútumspecifikáció C# nyelvspecifikációs szakasza.

  • Minden attribútum meghatározza, AttributeUsageAttribute hogy milyen deklarációtípusokat céloz meg. Az attribútumot csak ezekre a típusokra (CS0592) kell alkalmaznia. Például egy osztályhoz AttributeTargets.Interface definiált attribútum nem alkalmazható.
  • Ha olyan attribútum-céljelölőt használ, mint a method: vagy property:, a kijelölőnek érvényesnek kell lennie arra a deklarációra, amelyben megjelenik (CS0657). Ellenőrizze a hibaüzenetet, hogy mely céljelölők engedélyezettek az adott deklarációhoz.
  • A használt attribútum-célkijelölő nem felismert kijelölő (CS0658). Az érvényes meghatározók közé tartozik a assembly:, module:, type:, method:, property:field:, event:, , param:és return:.
  • Egyes attribútumok, például ObsoleteAttribute és CLSCompliantAttribute, nem érvényesek a tulajdonság- vagy eseménykiegészítőkre (CS1667). Helyezze át az attribútumot a tartozékból magához a tulajdonsághoz vagy eseménydeklarációhoz.
  • Az attribútumok csak az őket támogató programelemeken (CS7014) jelennek meg. Ha szerelvényszintű vagy modulszintű attribútumokat alkalmaz, használja a vagy a assembly:module: céljelölőket, és helyezze őket a fájl tetejére.

Előre definiált attribútumok

A következő hibák akkor fordulnak elő, ha adott előre definiált .NET-attribútumokat helytelenül használ:

  • CS0415: Ez az attribútum csak olyan indexelőn érvényes, amely nem explicit felülettag-deklaráció.
  • CS0609: Nem állítható be az attribútum egy felülírással megjelölt indexelőre.
  • CS0625: A StructLayout(LayoutKind.Explicit) jelöléssel ellátott típusokban az példánymezőknek rendelkezniük kell FieldOffset attribútummal.
  • CS0636: A FieldOffset attribútum csak a StructLayout(LayoutKind.Explicit) elemekkel megjelölt típusok tagjaira helyezhető.
  • CS0637: A FieldOffset attribútum statikus vagy const mezőkön nem engedélyezett.
  • CS0646: Nem adható meg a DefaultMember attribútum egy indexelőt tartalmazó típuson.
  • CS0668: Két indexelő neve eltérő; az IndexerName attribútumot azonos névvel kell használni minden indexelőn egy típuson belül
  • CS0735: A TypeForwardedTo attribútum argumentumaként megadott típus érvénytelen
  • CS0739: Duplicate TypeForwardedToAttribute
  • CS1608: A RequiredAttribute attribútum nem engedélyezett C#-típusok esetén
  • CS9331: Az attribútum nem alkalmazható manuálisan.

A hibák kijavításához kövesse az alábbi szabályokat. További információt az Indexelők, a StruktúratípusokTypeForwardedToAttribute és a Platformhívás (P/Invoke) című témakörben talál.

  • Ez IndexerNameAttribute csak olyan indexelőkre alkalmazható, amelyek nem explicit felülettag-deklarációk (CS0415). Távolítsa el az attribútumot az explicit felület indexelőiből, mert az illesztő már definiálja az indexelő nevét.
  • Nem lehet alkalmazni a IndexerName megjelölt indexelőkre override, mert a felülírt indexelők az alaposztálytól öröklik a nevét (CS0609). Távolítsa el az IndexerName attribútumot a felülbírálási indexelőből.
  • A StructLayout(LayoutKind.Explicit) jelöléssel ellátott típus minden példánymezőjének rendelkeznie kell egy FieldOffsetAttribute-vel (CS0625). Az explicit elrendezés igényli, hogy megadja az egyes példánymezők bájteltolását.
  • A FieldOffsetAttribute csak olyan típusok tagjaira helyezhető, amelyeknek StructLayoutAttribute értéke LayoutKind.Explicit (CS0636). Adja hozzá az StructLayout attribútumot a típusdeklarációhoz.
  • A FieldOffset attribútum nem engedélyezett a static vagy const mezőkön, mert az explicit elrendezés csak a példánymezőkre (CS0637) vonatkozik. Távolítsa el az FieldOffset attribútumot a statikus vagy a const mezőből.
  • Nem alkalmazható olyan típusra DefaultMemberAttribute , amely már tartalmaz indexelőt, mert a fordító automatikusan meghatározza az indexelőkkel rendelkező típusok alapértelmezett tagját (CS0646). Távolítsa el a DefaultMember attribútumot.
  • A típuson belüli összes IndexerNameAttribute attribútumnak ugyanazt a nevet kell megadnia (CS0668). Módosítsa a neveket egyezőre, mert a futtatókörnyezet egyetlen nevet használ egy típus összes indexelőjéhez.
  • Az argumentumként megadott TypeForwardedToAttribute típusnak nem általánosnak, nem beágyazottnak, nem mutatónak, és nem tömbnek kell lennie (CS0735). Csak a legfelső szintű elnevezett típusok érvényesek a továbbítási célokra.
  • Egy szerelvény csak egy TypeForwardedToAttribute külső típushoz (CS0739) tartozhat. Keresse meg és távolítsa el az ismétlődő deklarációt TypeForwardedTo .
  • A RequiredAttributeAttribute C#-ban (CS1608) definiált típusok esetében ez nem engedélyezett. Ez az attribútum más nyelvek számára van fenntartva, amelyek egy adott funkció megkövetelésére kényszerítik a fordítókat.
  • Egyes attribútumok a fordító számára vannak fenntartva, és nem alkalmazhatók manuálisan a forráskódban (CS9331). Cserélje le az attribútumot az azzal egyenértékű C# nyelvszintaxisra, amely miatt a fordító létrehozza azt.

Feltételes attribútumok használata

A használati korlátozásokat megsértő módok alkalmazásakor a ConditionalAttribute következő hibák jelentkeznek:

  • CS0243: A feltételes attribútum érvénytelen a metóduson, mert felülbírálási módszer.
  • CS0577: A feltételes attribútum érvénytelen, mert konstruktor, destruktor, operátor, lambda kifejezés vagy explicit felületi implementáció.
  • CS0578: A feltételes attribútum érvénytelen a függvényen, mert a visszatérési típusa nem érvénytelen.
  • CS0582: A feltételes attribútum nem érvényes a felülettagokon.
  • CS0629: A feltételes tag "tag" nem tudja implementálni az "alaposztály tag" illesztőtagot a típusnév típusában.
  • CS0685: A feltételes tag "tag" nem rendelkezhet kimenő paramétersel.
  • CS1618: Nem hozható létre delegált metódussal, mert az vagy a felülbírált metódus feltételes attribútummal rendelkezik
  • CS1689: Az attribútum csak metódusokon vagy attribútumosztályokon érvényes

A hibák kijavításához kövesse az alábbi szabályokat. További információ: ConditionalAttributefeltételes metódusok és attribútumok.

  • A fordító nem a felülbíráláshoz, hanem az alapmetódus-deklarációhoz köti a hívásokat, így az attribútum nem alkalmazható Conditional metódusokra (CS0243). Távolítsa el az attribútumot a Conditional felülbírálási módszerből, vagy távolítsa el a kulcsszót override .
  • Az Conditional attribútum nem érvényes konstruktorokra, véglegesítőkre, operátorokra, lambdakifejezésekre vagy explicit felületi implementációkra (CS0577). Ezek a tagtípusok nem hagyhatók ki feltételesen, mert kötelező szerepkörök vannak a típus életciklusában vagy szerződésében.
  • A feltételes metódusokat vissza kell adni void , mert előfordulhat, hogy a fordító teljes egészében kihagyja a hívást, és a hívó számára nem lesz elérhető visszatérési érték (CS0578). Módosítsa a metódus visszatérési típusát void-re, vagy távolítsa el a Conditional attribútumot.
  • A felülettagok nem lehetnek feltételesek, mert minden illesztőtagot végre kell hajtani (CS0582). Távolítsa el az Conditional attribútumot a felülettag-deklarációból.
  • Az interfésztagokat megvalósító metódusok nem lehetnek feltételesek, mert az interfészszerződés megköveteli, hogy az összes buildben (CS0629) jelen legyenek. Távolítsa el az Conditional attribútumot a implementálási módszerből.
  • A feltételes metódusok nem tartalmazhatnak out paramétereket, mert a out változó értéke nem lesz meghatározva, ha a fordító kihagyja a metódushívást (CS0685). Távolítsa el a out paramétereket a metódusból, vagy távolítsa el az Conditional attribútumot.
  • Nem hozhat létre feltételes metódusra hivatkozó meghatalmazottat, mert előfordulhat, hogy a metódus nem létezik olyan buildekben, amelyekben nincs megadva a feltételszimbólum (CS1618). Távolítsa el az Conditional attribútumot a metódusból, vagy ne használja delegált célként.
  • Az Conditional attribútum csak metódusokon és attribútumosztályokon (CS1689) érvényes. Nem érvényes más deklarációtípusokra, például nem attribútumosztályokra, szerkezetekre vagy interfészekre.

CallerArgumentExpression attribútum használata

A következő hibák akkor fordulnak elő, ha a CallerArgumentExpressionAttribute helytelenül van alkalmazva, vagy ütközik más hívóinformációs attribútumokkal.

  • CS8959: A CallerArgumentExpressionAttribute nem alkalmazható, mert nincs szabványos átalakítás az 1. típusról a 2. típusra
  • CS8960: A paraméterre alkalmazott CallerArgumentExpressionAttribute függvénynek nincs hatása. Ezt a CallerLineNumberAttribute felülbírálja.
  • CS8961: A paraméterre alkalmazott CallerArgumentExpressionAttribute nem lesz hatással. Ezt felülbírálja a CallerFilePathAttribute.
  • CS8962: A paraméterre alkalmazott CallerArgumentExpressionAttribute függvénynek nincs hatása. Ezt felülbírálja a CallerMemberNameAttribute.
  • CS8963: A paraméterre alkalmazott CallerArgumentExpressionAttribute függvénynek nincs hatása. Érvénytelen paraméternévvel alkalmazza a rendszer.

A hibák kijavításához kövesse az alábbi szabályokat. További információ: Hívóinformációs attribútumok és CallerArgumentExpressionAttribute.

  • A CallerArgumentExpression-val díszített paraméternek típusa string kell legyen, vagy olyan típus kell legyen, amelyből szabványos konverzió létezik string-ból/-ből, mert az attribútum a hívó argumentumkifejezésének egy string ábrázolását adja meg (CS8959). Módosítsa a paraméter típusát string típusra, vagy kompatibilis típusra.
  • Az CallerArgumentExpression attribútumnak nincs hatása egy olyan paraméterre, amely szintén rendelkezik CallerLineNumberAttribute, CallerFilePathAttributevagy CallerMemberNameAttribute (CS8960, CS8961, CS8962). Ezek a hívóinformációs attribútumok elsőbbséget élveznek, ezért távolítsa el az CallerArgumentExpression attribútumot a paraméterből.
  • A konstruktornak CallerArgumentExpression átadott sztringargumentumnak meg kell egyeznie egy másik paraméter nevével ugyanabban a metódus-aláírásban (CS8963). Ha a paraméter neve hibás, vagy nem létező paraméterre hivatkozik, az attribútumnak nincs hatása.