Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo illustra gli errori del compilatore seguenti:
- CS0181: il parametro del costruttore dell'attributo ha un tipo, che non è un tipo di parametro di attributo valido
- 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.
- CS0579: Attributo duplicato
- CS0582: l'attributo Condizionale non è valido nei membri dell'interfaccia.
- CS0592: l'attributo non è valido in questo tipo di dichiarazione. È valida solo per dichiarazioni specifiche.
- CS0609: impossibile impostare l'attributo su un indicizzatore contrassegnato come override.
- CS0616: Il tipo non è una classe di attributi
- 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.
- CS0647: Errore durante l'emissione dell'attributo
- 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.
- CS0668: due indicizzatori hanno nomi diversi. L'attributo IndexerName deve essere usato con lo stesso nome in ogni indicizzatore all'interno di un tipo
- CS0685: il membro condizionale 'member' non può avere un parametro out.
- CS0735: tipo non valido specificato come argomento per l'attributo TypeForwardedTo
- CS0739: Tipo duplicatoForwardedToAttribute
- CS1608: L'attributo RequiredAttribute non è consentito nei tipi C#
- CS1614: Il nome dell'attributo è ambiguo. Usare "@name" o includere in modo esplicito il suffisso 'Attribute'.
- CS1618: Impossibile creare un delegato con il metodo perché il metodo stesso oppure un metodo di cui esegue l'override ha un attributo Conditional
- CS1667: l'attributo non è valido per le funzioni di accesso alle proprietà o agli eventi. È valida solo per dichiarazioni specifiche.
- CS1689: l'attributo è valido solo per metodi o classi di attributi
- 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.
- CS8959: Impossibile applicare CallerArgumentExpressionAttribute perché non sono presenti conversioni standard da type1 a type2
- CS8960: CallerArgumentExpressionAttribute applicato al parametro non avrà alcun effetto. Viene sottoposto a override da CallerLineNumberAttribute.
- CS8961: CallerArgumentExpressionAttribute applicato al parametro non avrà alcun effetto. Viene sottoposto a override da CallerFilePathAttribute.
- CS8962: CallerArgumentExpressionAttribute applicato al parametro non avrà alcun effetto. Viene sottoposto a override da CallerMemberNameAttribute.
- CS8963: CallerArgumentExpressionAttribute applicato al parametro non avrà alcun effetto. Viene applicato con un nome di parametro non valido.
- CS8968: un argomento di tipo attributo non può usare parametri di tipo
- CS8970: il tipo non può essere usato in questo contesto perché non può essere rappresentato nei metadati.
- CS9331: l'attributo non può essere applicato manualmente.
Argomenti e parametri degli attributi
Quando si usano argomenti di attributo o parametri in modo non corretto, vengono visualizzati gli errori seguenti:
- CS0181: il parametro del costruttore dell'attributo ha un tipo, che non è un tipo di parametro di attributo valido
- 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.
- CS0647: Errore nell'emissione dell'attributo
- 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.
- CS8968: un argomento di tipo attributo non può usare parametri di tipo
- CS8970: il tipo non può essere usato in questo contesto perché non può essere rappresentato nei metadati.
Per correggere questi errori, attenersi alle regole seguenti:
- I parametri del costruttore di attributi devono usare tipi di parametro di attributo validi (CS0181). La specifica del linguaggio C# limita i tipi di parametro dell'attributo ai tipi primitivi (
bool,byte,char,double,float,int,long,shortestring),object,System.Type, i tipi di enumerazione e le matrici unidimensionali di questi tipi. I puntatori a funzione e altri tipi che non possono essere rappresentati nei metadati non sono tipi di parametri di attributo validi. - Gli argomenti degli attributi devono essere valori costanti in fase di compilazione, pertanto non è possibile usare i parametri di tipo come argomenti di attributo (CS0416). Il compilatore deve risolvere gli argomenti dell'attributo in fase di compilazione e i parametri di tipo non sono noti fino a quando non viene costruito il tipo generico.
- Non è possibile applicare argomenti di tipo a un attributo non generico (CS0447). Se una classe di attributi non è generica, l'utilizzo non può includere argomenti di tipo tra parentesi angolari.
- Tutti i valori passati a un costruttore di attributi devono essere formattati correttamente e all'interno dell'intervallo valido per ogni parametro (CS0647). Ad esempio, un oggetto GuidAttribute richiede una stringa di formato GUID valida.
- Quando si applica l'attributo (CS7046, CS7047, CS7047), è necessario specificare tutti i parametri di attributo obbligatori. Controllare la firma del costruttore dell'attributo per determinare quali parametri sono obbligatori e specificare argomenti validi per ogni parametro.
- Quando si definisce un attributo personalizzato con parametri di costruttore facoltativi, specificare i valori predefiniti per tali parametri (CS7067). Usare la sintassi
parameterType parameterName = defaultValuenel costruttore dell'attributo in modo che i chiamanti possano omettere tali argomenti. - Gli argomenti del tipo di attributo generico devono essere tipi concreti, non parametri di tipo (CS8968). Il compilatore deve determinare completamente gli argomenti del tipo di attributo generico in fase di compilazione, pertanto i parametri di tipo aperto non sono consentiti.
- I tipi usati come argomenti di attributo devono essere rappresentabili nei metadati (CS8970). Alcuni tipi costruiti, ad esempio quelli che coinvolgono
dynamico determinati nomi di elementi di tupla, non possono essere codificati nei metadati e non sono consentiti come argomenti di tipo attributo.
Per ulteriori informazioni, fare riferimento ad Attributi, Generics e alla sezione della specifica del linguaggio C# sugli attributi.
Annotazioni
CS0447 e CS0647 sono deprecati. Il compilatore corrente non genera questi errori.
Requisiti delle classi degli attributi
Quando si definiscono classi di attributi che non soddisfano i vincoli necessari, vengono visualizzati gli errori seguenti:
- CS0404: l'attributo non è valido in questo tipo di dichiarazione.
- CS0579: Attributo duplicato
- CS0616: Il tipo non è una classe di attributi
- CS0641: questo attributo è valido solo nelle classi derivate da System.Attribute'.
- CS0653: impossibile applicare la classe di attributi 'class' perché è astratta.
- CS1614: Il nome dell'attributo è ambiguo. Usare "@name" o includere in modo esplicito il suffisso 'Attribute'.
Per correggere questi errori, attenersi alle regole seguenti:
- Applicare attributi solo ai tipi di dichiarazione consentiti dall'attributo AttributeUsageAttribute (CS0404). Controllare il
AttributeTargetsvalore specificato nell'attributoAttributeUsageper vedere quali destinazioni sono valide. - Se si applica lo stesso attributo più di una volta a una singola destinazione, rimuovere il duplicato o impostare
AllowMultiple = truenell'attributo AttributeUsageAttribute (CS0579). Per impostazione predefinita, gli attributi possono essere visualizzati una sola volta su ogni destinazione. - Il tipo usato nella sintassi degli attributi deve ereditare da System.Attribute (CS0616). Solo le classi derivate da
System.Attributepossono essere usate come attributi. Altri tipi causano questo errore anche se hanno un nome simile. - È possibile applicare AttributeUsageAttribute solo alle classi che derivano da
Attribute(CS0641). L'attributo controlla laAttributeUsagemodalità di utilizzo di altri attributi e si limita alle classi di attributi. - Le classi di attributi non possono essere
abstractperché il compilatore deve crearne un'istanza (CS0653). Rimuovere il modificatore dalla classe dell'attributoabstracto derivare una classe concreta dalla base astratta. - Quando esistono entrambe
Examplele classi di attributi eExampleAttribute, il compilatore non è in grado di determinare a quale[Example]si riferisce (CS1614). Disambiguare usando[@Example]per il nome più breve o[ExampleAttribute]per il nome più lungo.
Per altre informazioni, vedere Creare attributi personalizzati e la sezione Specifica del linguaggio C# sugli attributi.
Contesto della posizione dell'attributo
Gli errori seguenti si verificano quando si applicano attributi in posizioni non valide o si usano identificatori di destinazione non corretti:
- CS0592: l'attributo non è valido in questo tipo di dichiarazione. È valida solo per dichiarazioni specifiche.
- 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.
- CS1667: l'attributo non è valido per le funzioni di accesso alle proprietà o agli eventi. È valida solo per dichiarazioni specifiche.
- CS7014: gli attributi non sono validi in questo contesto.
Per correggere questi errori, seguire queste regole. Per altre informazioni, vedere Destinazioni degli attributi e la sezione Specifica del linguaggio C# sulla specifica dell'attributo.
- Ogni attributo AttributeUsageAttribute specifica i tipi di dichiarazione a cui è destinato. È necessario applicare l'attributo solo a tali tipi (CS0592). Ad esempio, non è possibile applicare un attributo definito con
AttributeTargets.Interfacea una classe. - Quando si usa un identificatore di destinazione dell'attributo,
method:ad esempio oproperty:, l'identificatore deve essere valido per la dichiarazione in cui viene visualizzata (CS0657). Controllare il messaggio di errore per vedere quali identificatori di destinazione sono consentiti per la dichiarazione specifica. - L'identificatore di destinazione dell'attributo usato non è un identificatore riconosciuto (CS0658). Gli identificatori validi includono
assembly:,module:type:,method:,property:,field:,event:,param:ereturn:. - Alcuni attributi, ad esempio ObsoleteAttribute e CLSCompliantAttribute, non sono validi per le funzioni di accesso alle proprietà o agli eventi (CS1667). Sposta l'attributo dall'accessor alla proprietà o alla dichiarazione di evento stessa.
- Gli attributi possono essere visualizzati solo sugli elementi del programma che li supportano (CS7014). Se si applicano attributi a livello di assembly o a livello di modulo, usare gli
assembly:identificatori di destinazione omodule:e inserirli all'inizio del file.
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.
- CS0668: due indicizzatori hanno nomi diversi. L'attributo IndexerName deve essere usato con lo stesso nome in ogni indicizzatore all'interno di un tipo
- CS0735: tipo non valido specificato come argomento per l'attributo TypeForwardedTo
- CS0739: Tipo duplicato TypeForwardedToAttribute
- CS1608: L'attributo RequiredAttribute non è consentito nei tipi C#
- CS9331: l'attributo non può essere applicato manualmente.
Per correggere questi errori, seguire queste regole. Per altre informazioni, vedere Indicizzatori, Tipi di struttura, TypeForwardedToAttributee Platform Invoke (P/Invoke).
- IndexerNameAttribute Può essere applicato solo agli indicizzatori che non sono dichiarazioni esplicite di membri dell'interfaccia (CS0415). Rimuovere l'attributo dagli indicizzatori di interfaccia espliciti, perché l'interfaccia definisce già il nome dell'indicizzatore.
- Non è possibile applicare
IndexerNameagli indicizzatori contrassegnati conoverrideperché gli indicizzatori di override ereditano il nome dalla classe di base (CS0609). Rimuovere l'attributoIndexerNamedall'indicizzatore di override. - Ogni campo di istanza in un tipo contrassegnato con
StructLayout(LayoutKind.Explicit)deve avere un FieldOffsetAttribute (CS0625). Per il layout esplicito è necessario specificare l'offset dei byte per ogni campo dell'istanza. -
FieldOffsetAttribute può essere posizionato solo su membri di tipi che hanno impostato StructLayoutAttribute su
LayoutKind.Explicit(CS0636). Aggiungere l'attributoStructLayoutalla dichiarazione di tipo contenitore. - L'attributo
FieldOffsetnon è consentito neistaticcampi oconstperché il layout esplicito si applica solo ai campi dell'istanza (CS0637). Rimuovere l'attributoFieldOffsetdal campo statico o const. - Non è possibile applicare DefaultMemberAttribute a un tipo che contiene già un indicizzatore perché il compilatore definisce automaticamente il membro predefinito per i tipi con indicizzatori (CS0646). Rimuovere l'attributo
DefaultMember. - Tutti gli IndexerNameAttribute attributi all'interno di un tipo devono specificare lo stesso nome (CS0668). Modificare i nomi in modo che corrispondano, perché il runtime usa un singolo nome per tutti gli indicizzatori in un tipo.
- Il tipo specificato come argomento per TypeForwardedToAttribute deve essere un tipo non generico, non annidato, non di tipo matrice (CS0735). Solo i tipi denominati di primo livello sono destinazioni di inoltro valide.
- Un assembly può avere un TypeForwardedToAttribute solo per ogni tipo esterno (CS0739). Individuare e rimuovere la dichiarazione duplicata
TypeForwardedTo. - Il RequiredAttributeAttribute non è consentito nei tipi definiti in C# (CS1608). Questo attributo è riservato ad altri linguaggi che devono forzare i compilatori a richiedere una particolare funzionalità.
- Alcuni attributi sono riservati al compilatore e non possono essere applicati manualmente nel codice sorgente (CS9331). Sostituire l'attributo con la sintassi del linguaggio C# equivalente che provoca la sua generazione da parte del compilatore.
Utilizzo degli attributi condizionali
Quando si applicano i ConditionalAttribute metodi che violano le restrizioni di utilizzo, vengono visualizzati gli errori seguenti:
- 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.
- CS1618: Impossibile creare un delegato con il metodo perché il metodo stesso o quello che sovrascrive ha un attributo Conditional
- CS1689: l'attributo è valido solo per metodi o classi di attributi
Per correggere questi errori, seguire queste regole. Per altre informazioni, vedere ConditionalAttributeMetodi condizionali e Attributi.
- Il compilatore associa le chiamate alla dichiarazione del metodo di base, non all'override, pertanto non è possibile applicare l'attributo
Conditionalai metodi di override (CS0243). Rimuovere l'attributoConditionaldal metodo di override o rimuovere laoverrideparola chiave . - L'attributo
Conditionalnon è valido per costruttori, finalizzatori, operatori, espressioni lambda o implementazioni esplicite dell'interfaccia (CS0577). Questi tipi di membro non possono essere omessi in modo condizionale perché hanno ruoli obbligatori nel ciclo di vita o nel contratto del tipo. - I metodi condizionali devono restituire
voidperché il compilatore potrebbe omettere completamente la chiamata e nessun valore restituito sarebbe disponibile per il chiamante (CS0578). Modificare il tipo restituito del metodo invoido rimuovere l'attributoConditional. - I membri dell'interfaccia non possono essere condizionali perché tutti i membri dell'interfaccia devono essere implementati (CS0582). Rimuovere l'attributo
Conditionaldalla dichiarazione del membro dell'interfaccia. - I metodi che implementano i membri dell'interfaccia non possono essere condizionali perché il contratto di interfaccia richiede che siano presenti in tutte le compilazioni (CS0629). Rimuovere l'attributo
Conditionaldal metodo di implementazione. - I metodi condizionali non possono avere
outparametri perché il valore dellaoutvariabile non è definito quando il compilatore omette la chiamata al metodo (CS0685). Rimuovere ioutparametri dal metodo o rimuovere l'attributoConditional. - Non è possibile creare un delegato che faccia riferimento a un metodo condizionale perché il metodo potrebbe non esistere nelle compilazioni in cui il simbolo della condizione non è definito (CS1618). Rimuovere l'attributo
Conditionaldal metodo o non usarlo come destinazione del delegato. - L'attributo
Conditionalè valido solo per metodi e classi di attributi (CS1689). Non è valida in altri tipi di dichiarazione, ad esempio classi non di attributi, struct o interfacce.
Utilizzo dell'attributo CallerArgumentExpression
Gli errori seguenti si verificano quando si applicano CallerArgumentExpressionAttribute in modo non corretto o in conflitto con altri attributi di informazioni sul chiamante:
- CS8959: Impossibile applicare CallerArgumentExpressionAttribute perché non sono presenti conversioni standard da type1 a type2
- CS8960: CallerArgumentExpressionAttribute applicato al parametro non avrà alcun effetto. Viene sottoposto a override da CallerLineNumberAttribute.
- CS8961: CallerArgumentExpressionAttribute applicato al parametro non avrà alcun effetto. Viene sottoposto a override da CallerFilePathAttribute.
- CS8962: CallerArgumentExpressionAttribute applicato al parametro non avrà alcun effetto. Viene sottoposto a override da CallerMemberNameAttribute.
- CS8963: CallerArgumentExpressionAttribute applicato al parametro non avrà alcun effetto. Viene applicato con un nome di parametro non valido.
Per correggere questi errori, seguire queste regole. Per altre informazioni, vedere Attributi delle informazioni sul chiamante e CallerArgumentExpressionAttribute.
- Il parametro decorato con
CallerArgumentExpressiondeve avere un tipostringo un tipo con una conversione standard dastring, perché l'attributo inserisce unastringrappresentazione dell'espressione di argomento del chiamante (CS8959). Modificare il tipo di parametro instringo in un tipo compatibile. - L'attributo
CallerArgumentExpressionnon ha alcun effetto su un parametro che ha CallerLineNumberAttributeanche , CallerFilePathAttributeo CallerMemberNameAttribute (CS8960, CS8961, CS8962). Tali attributi di informazioni chiamante hanno la precedenza, quindi rimuovere l'attributoCallerArgumentExpressiondal parametro . - L'argomento stringa passato al
CallerArgumentExpressioncostruttore deve corrispondere al nome di un altro parametro nella stessa firma del metodo (CS8963). Se il nome del parametro viene scritto in modo errato o fa riferimento a un parametro inesistente, l'attributo non ha alcun effetto.