Dela via


Lösa fel och varningar som rör attributdeklarationer eller attributanvändning i koden

Den här artikeln beskriver följande kompilatorfel:

  • CS0181: Attributkonstruktorparametern har en typ som inte är en giltig attributparametertyp
  • CS0243: Villkorsattributet är inte giltigt för metoden eftersom det är en åsidosättningsmetod.
  • CS0404: Attributet är inte giltigt för den här deklarationstypen.
  • CS0415: Det här attributet är endast giltigt för en indexerare som inte är en explicit medlemsdeklaration för gränssnittet.
  • CS0416: "type parameter": ett attributargument kan inte använda typparametrar.
  • CS0447: Attributet kan inte användas med typargument.
  • CS0577: Villkorsattributet är inte giltigt eftersom det är en konstruktor, destructor, operator, lambda-uttryck eller explicit gränssnittsimplementering.
  • CS0578: Villkorsattributet är inte giltigt för funktionen eftersom dess returtyp inte är ogiltig.
  • CS0579: Duplicerat attribut
  • CS0582: Villkorsattributet är inte giltigt för gränssnittsmedlemmar.
  • CS0592: Attributet är inte giltigt för den här deklarationstypen. Det är endast giltigt för specifika deklarationer.
  • CS0609: Det går inte att ange attributet på en indexerare som har markerats som override.
  • CS0616: Typen är inte en attributklass
  • CS0625: Instansfältet i typer som har markerats med StructLayout(LayoutKind.Explicit) måste ha ett FieldOffset-attribut.
  • CS0629: Villkorsmedlemmen "member" kan inte implementera gränssnittsmedlemmen "basgruppsmedlemmen" i typen "Typnamn".
  • CS0636: Attributet FieldOffset kan bara placeras på medlemmar av typer som har markerats med StructLayout(LayoutKind.Explicit).
  • CS0637: Attributet FieldOffset tillåts inte för statiska fält eller streckfält.
  • CS0641: Det här attributet är endast giltigt för klasser som härleds från System.Attribute.
  • CS0646: Det går inte att ange attributet DefaultMember för en typ som innehåller en indexerare.
  • CS0647: Fel vid generering av attribut
  • CS0653: Det går inte att tillämpa attributklassen "klass" eftersom den är abstrakt.
  • CS0657: Platsen är inte en giltig attributplats för den här deklarationen. Giltiga attributplatser för den här deklarationen visas. Alla attribut i det här blocket ignoreras.
  • CS0658: Platsen är inte en identifierad attributplats. Giltiga attributplatser för den här deklarationen visas. Alla attribut i det här blocket ignoreras.
  • CS0668: Två indexerare har olika namn. IndexerName-attributet måste användas med samma namn på varje indexerare inom en typ
  • CS0685: Villkorsstyrd medlem "medlem" kan inte ha en out-parameter.
  • CS0735: Ogiltig typ som anges som ett argument för attributet TypeForwardedTo
  • CS0739: Duplicera TypeForwardedToAttribute
  • CS1608: Attributet RequiredAttribute är inte tillåtet för C#-typer
  • CS1614: Attributnamnet är tvetydigt. Använd antingen "@name" eller inkludera uttryckligen suffixet "Attribut".
  • CS1618: Det går inte att skapa ombud med metoden eftersom den eller en metod som den åsidosätter har ett villkorsattribut
  • CS1667: Attributet är inte giltigt för egenskaps- eller händelseåtkomster. Det är endast giltigt för specifika deklarationer.
  • CS1689: Attributet är endast giltigt för metoder eller attributklasser
  • CS7014: Attribut är inte giltiga i den här kontexten.
  • CS7046: Attributparametern måste anges.
  • CS7047: Attributparametern "parameter1" eller "parameter2" måste anges.
  • CS7067: Attributkonstruktorparametern är valfri, men inget standardparametervärde har angetts.
  • CS8959: CallerArgumentExpressionAttribute kan inte tillämpas eftersom det inte finns några standardkonverteringar från type1 till type2
  • CS8960: Den CallerArgumentExpressionAttribute som tillämpas på parametern har ingen effekt. Den åsidosättas av CallerLineNumberAttribute.
  • CS8961: Den CallerArgumentExpressionAttribute som tillämpas på parametern har ingen effekt. Den åsidosättas av CallerFilePathAttribute.
  • CS8962: Den CallerArgumentExpressionAttribute som tillämpas på parametern har ingen effekt. Den åsidosättas av CallerMemberNameAttribute.
  • CS8963: Den CallerArgumentExpressionAttribute som tillämpas på parametern har ingen effekt. Det används med ett ogiltigt parameternamn.
  • CS8968: Ett attributtypsargument kan inte använda typparametrar
  • CS8970: Typen kan inte användas i den här kontexten eftersom den inte kan representeras i metadata.
  • CS9331: Attributet kan inte användas manuellt.

Attributargument och parametrar

Du ser följande fel när du använder attributargument eller parametrar felaktigt:

  • CS0181: Attributkonstruktorparametern har en typ som inte är en giltig attributparametertyp
  • CS0416: "type parameter": ett attributargument kan inte använda typparametrar.
  • CS0447: Attributet kan inte användas med typargument.
  • CS0647: Fel vid generering av attribut
  • CS7046: Attributparametern måste anges.
  • CS7047: Attributparametern "parameter1" eller "parameter2" måste anges.
  • CS7067: Attributkonstruktorparametern är valfri, men inget standardparametervärde har angetts.
  • CS8968: Ett attributtypsargument kan inte använda typparametrar
  • CS8970: Typen kan inte användas i den här kontexten eftersom den inte kan representeras i metadata.

Följ dessa regler för att åtgärda dessa fel:

  • Attributkonstruktorparametrar måste använda giltiga attributparametertyper (CS0181). C#-språkspecifikationen begränsar attributparametertyper till primitiva typer (bool, , bytechar, double, floatint, , long, shortoch string), object, System.Typeuppräkningstyper och endimensionella matriser av dessa typer. Funktionspekare och andra typer som inte kan representeras i metadata är inte giltiga attributparametertyper.
  • Attributargument måste vara konstanta värden för kompileringstid, så du kan inte använda typparametrar som attributargument (CS0416). Kompilatorn måste matcha attributargument vid kompileringstillfället och typparametrarna är inte kända förrän den generiska typen har konstruerats.
  • Du kan inte använda typargument för ett icke-generiskt attribut (CS0447). Om en attributklass inte är generisk kan dess användning inte innehålla typargument inom vinkelparenteser.
  • Alla värden som skickas till en attributkonstruktor måste vara korrekt formaterade och inom det giltiga intervallet för varje parameter (CS0647). Till exempel kräver en GuidAttribute en giltig GUID-formatsträng.
  • Du måste ange alla obligatoriska attributparametrar när du tillämpar attributet (CS7046, CS7047). Kontrollera attributets konstruktorsignatur för att avgöra vilka parametrar som är obligatoriska och ange giltiga argument för varje parameter.
  • När du definierar ett anpassat attribut med valfria konstruktorparametrar anger du standardvärden för dessa parametrar (CS7067). Använd syntaxen parameterType parameterName = defaultValue i attributkonstruktorn så att anropare kan utelämna dessa argument.
  • Allmänna attributtypsargument måste vara konkreta typer, inte typparametrar (CS8968). Kompilatorn måste helt fastställa generiska attributtypsargument vid kompileringstillfället, så att parametrar av öppen typ inte tillåts.
  • Typer som används som attributargument måste kunna representeras i metadata (CS8970). Vissa konstruerade typer, till exempel de som involverar dynamic eller vissa tuppelns elementnamn, kan inte kodas i metadata och tillåts inte som attributtypsargument.

Mer information finns i Avsnittet attribut, generiska objekt och C#-språkspecifikationen om attribut.

Anmärkning

CS0447 och CS0647 är inaktuella. Den aktuella kompilatorn genererar inte dessa fel.

Krav för attributklass

Du ser följande fel när du definierar attributklasser som inte uppfyller de nödvändiga begränsningarna:

  • CS0404: Attributet är inte giltigt för den här deklarationstypen.
  • CS0579: Duplicerat attribut
  • CS0616: Typen är inte en attributklass
  • CS0641: Det här attributet är endast giltigt för klasser som härleds från System.Attribute.
  • CS0653: Det går inte att tillämpa attributklassen "klass" eftersom den är abstrakt.
  • CS1614: Attributnamnet är tvetydigt. Använd antingen "@name" eller inkludera uttryckligen suffixet "Attribut".

Följ dessa regler för att åtgärda dessa fel:

  • Använd endast attribut för deklarationstyper som attributet AttributeUsageAttribute tillåter (CS0404). Kontrollera värdet AttributeTargets som anges i attributet AttributeUsage för att se vilka mål som är giltiga.
  • Om du använder samma attribut mer än en gång för ett enda mål tar du bort dubbletten eller anger AllowMultiple = true i attributet (AttributeUsageAttributeCS0579). Som standard kan attribut endast visas en gång på varje mål.
  • Den typ som används i attributsyntaxen måste ärva från System.Attribute (CS0616). Endast klasser som härleds från System.Attribute kan användas som attribut. Andra typer orsakar det här felet även om de har ett liknande namn.
  • Du kan endast tillämpa AttributeUsageAttribute på klasser som härleds från Attribute (CS0641). Attributet AttributeUsage styr hur andra attribut används och är i sig begränsat till attributklasser.
  • Attributklasser kan inte vara abstract eftersom kompilatorn måste instansiera dem (CS0653). abstract Ta bort modifieraren från attributklassen eller härled en konkret klass från den abstrakta basen.
  • När både Example - och ExampleAttribute attributklasser finns kan kompilatorn inte avgöra vilken som [Example] refererar till (CS1614). Klargör genom att använda [@Example] för det kortare namnet eller [ExampleAttribute] för det längre namnet.

Mer information finns i Skapa anpassade attribut och avsnittet C#-språkspecifikation för attribut.

Attributplatskontext

Följande fel uppstår när du tillämpar attribut på ogiltiga platser eller använder felaktiga målspecificerare:

  • CS0592: Attributet är inte giltigt för den här deklarationstypen. Det är endast giltigt för specifika deklarationer.
  • CS0657: Platsen är inte en giltig attributplats för den här deklarationen. Giltiga attributplatser för den här deklarationen visas. Alla attribut i det här blocket ignoreras.
  • CS0658: Platsen är inte en identifierad attributplats. Giltiga attributplatser för den här deklarationen visas. Alla attribut i det här blocket ignoreras.
  • CS1667: Attributet är inte giltigt för egenskaps- eller händelseåtkomster. Det är endast giltigt för specifika deklarationer.
  • CS7014: Attribut är inte giltiga i den här kontexten.

Följ dessa regler för att åtgärda dessa fel. Mer information finns i Avsnittet Om attributmål och C#-språkspecifikation om attributspecifikation.

  • Varje attribut anger vilka deklarationstyper AttributeUsageAttribute det riktar sig mot. Du måste endast använda attributet för dessa typer (CS0592). Du kan till exempel inte använda ett attribut som definierats med AttributeTargets.Interface för en klass.
  • När du använder en attributmålsspecificerare som method: eller property:måste specificeraren vara giltig för deklarationen där den visas (CS0657). Kontrollera felmeddelandet för att se vilka målspecificerare som tillåts för den specifika deklarationen.
  • Den attributmålsspecificerare som du använde är inte en identifierad specificerare (CS0658). Giltiga specificerare inkluderar assembly:, module:, type:, method:, property:, field:, event:, param: och return:.
  • Vissa attribut, till exempel ObsoleteAttribute och CLSCompliantAttribute, är inte giltiga för egenskaps- eller händelseåtkomster (CS1667). Flytta attributet från accessorn till själva egenskapen eller händelsedeklarationen.
  • Attribut kan bara visas på programelement som stöder dem (CS7014). Om du använder attribut på sammansättningsnivå eller modulnivå, använd målspecificerarna assembly: eller module: och placera dem överst i filen.

Fördefinierade attribut

Följande fel uppstår när du använder specifika fördefinierade .NET-attribut felaktigt:

  • CS0415: Det här attributet är endast giltigt för en indexerare som inte är en explicit medlemsdeklaration för gränssnittet.
  • CS0609: Det går inte att ange attributet på en indexerare markerad som override.
  • CS0625: Instansfältet i typer som har markerats med StructLayout(LayoutKind.Explicit) måste ha ett FieldOffset-attribut.
  • CS0636: Attributet FieldOffset kan bara placeras på medlemmar av typer som har markerats med StructLayout(LayoutKind.Explicit).
  • CS0637: Attributet FieldOffset tillåts inte för statiska fält eller streckfält.
  • CS0646: Det går inte att ange attributet DefaultMember för en typ som innehåller en indexerare.
  • CS0668: Två indexerare har olika namn. IndexerName-attributet måste användas med samma namn på varje indexerare inom en typ
  • CS0735: Ogiltig typ som anges som ett argument för attributet TypeForwardedTo
  • CS0739: Duplicera TypeForwardedToAttribute
  • CS1608: Attributet RequiredAttribute är inte tillåtet för C#-typer
  • CS9331: Attributet kan inte användas manuellt.

Följ dessa regler för att åtgärda dessa fel. Mer information finns i Indexerare, Strukturtyper, TypeForwardedToAttributeoch Plattformsanrop (P/Invoke).

  • IndexerNameAttribute kan endast tillämpas på indexerare som inte är explicita medlemsdeklarationer av gränssnitt (CS0415). Ta bort attributet från explicita gränssnittsindexerare eftersom gränssnittet redan definierar indexerarens namn.
  • Du kan inte tillämpa IndexerName på indexerare som är markerade med override, och detta beror på att åsidosättningsindexerare ärver sitt namn från basklassen (CS0609). IndexerName Ta bort attributet från åsidosättningsindexeraren.
  • Varje instansfält i en typ som markerats med StructLayout(LayoutKind.Explicit) måste ha en FieldOffsetAttribute (CS0625). Explicit layout kräver att du anger byte-offseten för varje instansfält.
  • FieldOffsetAttribute kan endast placeras på medlemmar av typer som har StructLayoutAttribute angivna till LayoutKind.Explicit (CS0636). StructLayout Lägg till attributet i den innehållande typdeklarationen.
  • Attributet FieldOffset tillåts inte på static fälten eller const eftersom explicit layout endast gäller för instansfält (CS0637). FieldOffset Ta bort attributet från fältet static eller const.
  • Du kan inte tillämpa på DefaultMemberAttribute en typ som redan innehåller en indexerare eftersom kompilatorn automatiskt definierar standardmedlemmen för typer med indexerare (CS0646). Ta bort attributet DefaultMember.
  • Alla IndexerNameAttribute attribut inom en typ måste ange samma namn (CS0668). Ändra namnen så att de matchar, eftersom runtime använder ett enda namn för alla indexerare på en typ.
  • Den typ som anges som argument för TypeForwardedToAttribute måste vara en icke-generisk, icke-kapslad, icke-pekare, icke-matristyp (CS0735). Endast namngivna typer på den översta nivån är giltiga vidarebefordransmål.
  • En sammansättning kan bara ha en TypeForwardedToAttribute för varje extern typ (CS0739). Leta upp och ta bort dubbeldeklarationen TypeForwardedTo.
  • RequiredAttributeAttribute Tillåts inte för typer som definierats i C# (CS1608). Det här attributet är reserverat för andra språk som behöver tvinga kompilatorer att kräva en viss funktion.
  • Vissa attribut är reserverade för kompilatorn och kan inte tillämpas manuellt i källkoden (CS9331). Ersätt attributet med motsvarande C#-språksyntax som gör att kompilatorn genererar det.

Användning av villkorsstyrda attribut

Du ser följande fel när du tillämpar ConditionalAttribute på sätt som bryter mot dess användningsbegränsningar.

  • CS0243: Villkorsattributet är inte giltigt för metoden eftersom det är en åsidosättningsmetod.
  • CS0577: Villkorsattributet är inte giltigt eftersom det är en konstruktor, destructor, operator, lambda-uttryck eller explicit gränssnittsimplementering.
  • CS0578: Villkorsattributet är inte giltigt för funktionen eftersom dess returtyp inte är ogiltig.
  • CS0582: Villkorsattributet är inte giltigt för gränssnittsmedlemmar.
  • CS0629: Den villkorsstyrda medlemmen "member" kan inte implementera gränssnittsmedlemmen "base class member" i typen "Type Name".
  • CS0685: Villkorsstyrd medlem "medlem" kan inte ha en utparameter.
  • CS1618: Det går inte att skapa ombud med metoden eftersom den eller en metod som den åsidosätter har ett villkorsattribut
  • CS1689: Attributet är endast giltigt för metoder eller attributklasser

Följ dessa regler för att åtgärda dessa fel. Mer information finns i ConditionalAttribute, villkorsstyrda metoder och attribut.

  • Kompilatorn binder anrop till basmetodens deklaration, inte åsidosättningen, så du kan inte använda Conditional attributet för att åsidosätta metoder (CS0243). Conditional Ta bort attributet från åsidosättningsmetoden eller ta bort nyckelordetoverride.
  • Attributet Conditional är inte giltigt för konstruktorer, slutförare, operatorer, lambda-uttryck eller explicita gränssnittsimplementeringar (CS0577). Dessa medlemstyper kan inte utelämnas villkorligt eftersom de har nödvändiga roller i typens livscykel eller kontrakt.
  • Villkorsstyrda metoder måste returneras void eftersom kompilatorn kan utelämna anropet helt och inget returvärde skulle vara tillgängligt för anroparen (CS0578). Ändra metodens returtyp till voideller ta bort attributet Conditional .
  • Gränssnittsmedlemmar kan inte villkoras eftersom alla gränssnittsmedlemmar måste implementeras (CS0582). Conditional Ta bort attributet från medlemsdeklarationen för gränssnittet.
  • Metoder som implementerar gränssnittsmedlemmar kan inte villkoras eftersom gränssnittskontraktet kräver att de finns i alla versioner (CS0629). Conditional Ta bort attributet från implementeringsmetoden.
  • Villkorsstyrda metoder kan inte ha out parametrar eftersom out variabelvärdet skulle vara odefinierat när kompilatorn utelämnar metodanropet (CS0685). Ta bort parametrarna out från metoden eller ta bort attributet Conditional .
  • Du kan inte skapa ett ombud som refererar till en villkorsstyrd metod eftersom metoden kanske inte finns i versioner där villkorssymbolen inte har definierats (CS1618). Ta bort Conditional-attributet från metoden, eller använd det inte som delegeringsmål.
  • Attributet Conditional är endast giltigt för metoder och attributklasser (CS1689). Det är inte giltigt för andra deklarationstyper, till exempel icke-attributklasser, structs eller gränssnitt.

CallerArgumentExpression-attributanvändning

Följande fel uppstår när du tillämpar CallerArgumentExpressionAttribute felaktigt eller i konflikt med andra informationsattribut för anropare:

  • CS8959: CallerArgumentExpressionAttribute kan inte tillämpas eftersom det inte finns några standardkonverteringar från type1 till type2
  • CS8960: Den CallerArgumentExpressionAttribute som tillämpas på parametern har ingen effekt. Den åsidosättas av CallerLineNumberAttribute.
  • CS8961: Den CallerArgumentExpressionAttribute som tillämpas på parametern har ingen effekt. Den åsidosättas av CallerFilePathAttribute.
  • CS8962: Den CallerArgumentExpressionAttribute som tillämpas på parametern har ingen effekt. Den åsidosättas av CallerMemberNameAttribute.
  • CS8963: Den CallerArgumentExpressionAttribute som tillämpas på parametern har ingen effekt. Det används med ett ogiltigt parameternamn.

Följ dessa regler för att åtgärda dessa fel. Mer information finns i Informationsattribut för uppringare och CallerArgumentExpressionAttribute.

  • Parametern som är dekorerad med CallerArgumentExpression måste ha typ string eller typ med en standardkonvertering från string, eftersom attributet matar in en string representation av anroparens argumentuttryck (CS8959). Ändra parametertypen till string eller en kompatibel typ.
  • Attributet CallerArgumentExpression har ingen effekt på en parameter som också har CallerLineNumberAttribute, CallerFilePathAttributeeller CallerMemberNameAttribute (CS8960, CS8961, CS8962). Dessa anroparinfoattribut har företräde, så ta bort CallerArgumentExpression attributet från parametern.
  • Strängargumentet som skickas till CallerArgumentExpression konstruktorn måste matcha namnet på en annan parameter i samma metodsignatur (CS8963). Om parameternamnet är felstavat eller refererar till en obefintlig parameter har attributet ingen effekt.