Condividi tramite


Risolvere gli errori e gli avvisi correlati alle dichiarazioni di attributi o all'uso di attributi nel codice

Questo articolo illustra gli errori del compilatore seguenti:

  • CS0243: l'attributo Conditional non è valido in 'method' perché è un metodo di override.
  • CS0404: l'attributo non è valido in questo tipo di dichiarazione.
  • CS0415: questo attributo è valido solo in un indicizzatore che non è una dichiarazione esplicita del membro dell'interfaccia.
  • CS0416: 'type parameter': un argomento attributo non può usare parametri di tipo.
  • CS0447: l'attributo non può essere usato con argomenti di tipo.
  • CS0577: l'attributo Conditional non è valido perché è un costruttore, un distruttore, un operatore, un'espressione lambda o un'implementazione esplicita dell'interfaccia.
  • CS0578: l'attributo Conditional non è valido per 'function' perché il tipo restituito non è void.
  • CS0582: l'attributo Condizionale non è valido nei membri dell'interfaccia.
  • CS0609: impossibile impostare l'attributo su un indicizzatore contrassegnato come override.
  • CS0625: il campo dell'istanza nei tipi contrassegnati con StructLayout(LayoutKind.Explicit) deve avere un attributo FieldOffset.
  • CS0629: il membro condizionale 'member' non può implementare il membro dell'interfaccia 'membro della classe base' nel tipo 'Type Name'.
  • CS0636: l'attributo FieldOffset può essere inserito solo su membri di tipi contrassegnati con StructLayout(LayoutKind.Explicit).
  • CS0637: l'attributo FieldOffset non è consentito nei campi statici o const.
  • CS0641: questo attributo è valido solo nelle classi derivate da System.Attribute'.
  • CS0646: impossibile specificare l'attributo DefaultMember in un tipo contenente un indicizzatore.
  • CS0653: impossibile applicare la classe di attributi 'class' perché è astratta.
  • CS0657: location non è un percorso di attributo valido per questa dichiarazione. Sono elencati i percorsi di attributo validi per questa dichiarazione. Tutti gli attributi in questo blocco verranno ignorati.
  • CS0658: la posizione non è una posizione dell'attributo riconosciuta. Sono elencati i percorsi di attributo validi per questa dichiarazione. Tutti gli attributi in questo blocco verranno ignorati.
  • CS0685: il membro condizionale 'member' non può avere un parametro out.
  • CS7014: gli attributi non sono validi in questo contesto.
  • CS7046: è necessario specificare il parametro attribute.
  • CS7047: è necessario specificare il parametro di attributo 'parameter1' o 'parameter2'.
  • CS7067: il parametro del costruttore dell'attributo è facoltativo, ma non è stato specificato alcun valore di parametro predefinito.
  • CS9331: l'attributo non può essere applicato manualmente.

Argomenti e parametri degli attributi

Gli errori seguenti si verificano quando si usano argomenti di attributo o parametri in modo non corretto:

  • CS0416: 'tipo di parametro': un argomento di attributo non può utilizzare parametri di tipo.
  • CS0447: l'attributo non può essere usato con argomenti di tipo.
  • CS7046: è necessario specificare il parametro attribute.
  • CS7047: è necessario specificare il parametro di attributo 'parameter1' o 'parameter2'.
  • CS7067: il parametro del costruttore dell'attributo è facoltativo, ma non è stato specificato alcun valore di parametro predefinito.

Per correggere questi errori, seguire queste regole.

  • Usare i valori costanti in fase di compilazione per gli argomenti dell'attributo anziché i parametri di tipo (CS0416). Gli argomenti degli attributi devono essere valutati in fase di compilazione.
  • Non usare argomenti di tipo con attributi (CS0447). Gli argomenti di tipo non sono consentiti nell'utilizzo degli attributi.
  • Specificare tutti i parametri di attributo necessari quando si applica l'attributo (CS7046, CS7047). Controllare il costruttore dell'attributo per verificare quali parametri sono obbligatori.
  • Specificare i valori predefiniti per i parametri del costruttore facoltativi quando si definiscono attributi personalizzati (CS7067). Usare la sintassi parameterType parameterName = defaultValue nel costruttore dell'attributo.

Per altre informazioni, vedere Attributi e generics.

Annotazioni

CS0447 non viene più usato in Roslyn.

Requisiti delle classi degli attributi

Gli errori seguenti si verificano quando si definiscono classi di attributi che non soddisfano i vincoli richiesti:

  • CS0404: l'attributo non è valido in questo tipo di dichiarazione.
  • CS0641: questo attributo è valido solo nelle classi derivate da System.Attribute'.
  • CS0653: impossibile applicare la classe di attributi 'class' perché è astratta.

Per correggere questi errori, seguire queste regole.

  • Applicare attributi solo a tipi di dichiarazione validi (CS0404). Controllare l'attributo AttributeUsage per verificare quali destinazioni sono consentite.
  • Rimuovere il abstract modificatore dalle classi di attributi o derivare da una classe di attributi non astratta (CS0653). Gli attributi devono essere creabili tramite un'istanza.
  • Si applica AttributeUsageAttribute solo alle classi che derivano da Attribute (CS0641). Questo attributo controlla la modalità di utilizzo di altri attributi.

Per altre informazioni, vedere Creare attributi personalizzati.

Contesto della posizione dell'attributo

Gli errori seguenti si verificano quando si applicano attributi in posizioni non valide o con identificatori di destinazione non corretti:

  • CS0657: location non è un percorso di attributo valido per questa dichiarazione. Sono elencati i percorsi di attributo validi per questa dichiarazione. Tutti gli attributi in questo blocco verranno ignorati.
  • CS0658: la posizione non è una posizione dell'attributo riconosciuta. Sono elencati i percorsi di attributo validi per questa dichiarazione. Tutti gli attributi in questo blocco verranno ignorati.
  • CS7014: gli attributi non sono validi in questo contesto.

Per correggere questi errori, seguire queste regole. Per altre informazioni, vedere Destinazioni degli attributi.

  • Usare identificatori di destinazione di attributi validi per la dichiarazione (CS0657). Controllare il messaggio di errore per visualizzare le destinazioni valide per la dichiarazione specifica.
  • Rimuovere identificatori di destinazione dell'attributo non validi (CS0658). Gli identificatori validi includono assembly:, module:type:, method:, property:, field:, event:, param:e return:.
  • Spostare gli attributi in contesti validi (CS7014). Gli attributi possono essere applicati solo agli elementi del programma che li supportano, come definito da AttributeUsageAttribute.
  • Applicare attributi a livello di ambito appropriato. Usare i assembly: o module: prefissi per gli attributi a livello di assembly o a livello di modulo.

Attributi predefiniti

Gli errori seguenti si verificano quando si usano attributi .NET predefiniti specifici in modo non corretto:

  • CS0415: questo attributo è valido solo in un indicizzatore che non è una dichiarazione esplicita del membro dell'interfaccia.
  • CS0609: impossibile impostare l'attributo su un indicizzatore contrassegnato come override.
  • CS0625: il campo dell'istanza nei tipi contrassegnati con StructLayout(LayoutKind.Explicit) deve avere un attributo FieldOffset.
  • CS0636: l'attributo FieldOffset può essere inserito solo su membri di tipi contrassegnati con StructLayout(LayoutKind.Explicit).
  • CS0637: l'attributo FieldOffset non è consentito nei campi statici o const.
  • CS0646: impossibile specificare l'attributo DefaultMember in un tipo contenente un indicizzatore.
  • CS9331: l'attributo non può essere applicato manualmente.

Per correggere questi errori, seguire queste regole. Per altre informazioni, vedere Indicizzatori e Platform Invoke (P/Invoke).

  • Rimuovere IndexerNameAttribute dalle implementazioni esplicite dell'interfaccia (CS0415). Applicarlo solo agli indicizzatori pubblici.
  • Rimuovere IndexerName dagli indicizzatori contrassegnati con override (CS0609). Gli indicizzatori di override ereditano il nome dalla classe di base.
  • Aggiungi FieldOffsetAttribute a tutti i campi di istanza nei tipi con StructLayoutAttribute impostato su LayoutKind.Explicit (CS0625). Il layout esplicito richiede posizioni di campo esplicite.
  • Applica FieldOffset solo ai tipi che dispongono di StructLayout(LayoutKind.Explicit) (CS0636). Aggiungere l'attributo StructLayout alla dichiarazione di tipo.
  • Rimuovere FieldOffset da static o const campi (CS0637). Il layout esplicito si applica solo ai campi dell'istanza.
  • Rimuovere DefaultMemberAttribute dai tipi che contengono indicizzatori (CS0646). Gli indicizzatori definiscono automaticamente il membro predefinito.
  • Sostituire gli attributi generati dal compilatore con la sintassi C# equivalente (CS9331). Usare parole chiave del linguaggio invece di applicare manualmente gli attributi riservati.

Utilizzo degli attributi condizionali

Gli errori seguenti si verificano quando si applica il ConditionalAttribute in modi che violano le limitazioni d'uso.

  • CS0243: l'attributo Conditional non è valido in 'method' perché è un metodo di override.
  • CS0577: l'attributo Conditional non è valido perché è un costruttore, un distruttore, un operatore, un'espressione lambda o un'implementazione esplicita dell'interfaccia.
  • CS0578: l'attributo Conditional non è valido per 'function' perché il tipo restituito non è void.
  • CS0582: l'attributo Condizionale non è valido nei membri dell'interfaccia.
  • CS0629: il membro condizionale 'member' non può implementare il membro dell'interfaccia 'membro della classe base' nel tipo 'Type Name'.
  • CS0685: il membro condizionale 'member' non può avere un parametro out.

Per correggere questi errori, seguire queste regole. Per altre informazioni, vedere ConditionalAttributee Attributi.

  • Rimuovere l'attributo Conditional dai metodi di override o rimuovere la override parola chiave (CS0243). Il compilatore viene associato al metodo di base, non all'override.
  • Non si applicano Conditional a costruttori, finalizzatori, operatori, espressioni lambda o implementazioni esplicite dell'interfaccia (CS0577). Questi tipi di membri non supportano la compilazione condizionale.
  • Modificare il tipo restituito del metodo in voido rimuovere l'attributo Conditional (CS0578). I metodi condizionali devono restituire void perché le chiamate potrebbero essere omesse durante la compilazione.
  • Rimuovere l'attributo dalle dichiarazioni dei membri dell'interfaccia Conditional (CS0582). I membri dell'interfaccia non possono essere condizionali.
  • Rimuovere l'attributo dalle implementazioni dei membri dell'interfaccia Conditional (CS0629). I metodi che implementano i membri dell'interfaccia non possono essere condizionali.
  • Rimuovere out i parametri dai metodi condizionali o rimuovere l'attributo Conditional (CS0685). Il valore della out variabile non sarà definito quando la chiamata al metodo viene compilata.