Condividi tramite


Risolvere gli avvisi relativi all'uso e alla dichiarazione dei namespace

Questo articolo illustra gli errori del compilatore seguenti:

  • CS0104: Errore: 'reference' è un riferimento ambiguo tra 'identifier' e 'identifier'.
  • CS0116: Errore: uno spazio dei nomi non può contenere direttamente membri, ad esempio campi, metodi o istruzioni.
  • CS0138: Errore: una direttiva using namespace può essere applicata solo agli spazi dei nomi. 'Type' è un tipo, non uno spazio dei nomi.
  • CS0430: Errore: l'alias extern 'alias' non è stato specificato in un'opzione /reference.
  • CS0431: Non è possibile usare l'alias 'identifier' con :: perché l'alias fa riferimento a un tipo. Usare ., in alternativa.
  • CS0432: Errore: alias 'identificatore' non trovato.
  • CS0434: Errore: Lo spazio dei nomi NamespaceName1 in NamespaceName2 è in conflitto con il tipo TypeName1 in NamespaceName3.
  • CS0438: Errore: il tipo 'type' in 'module_1' è in conflitto con lo spazio dei nomi 'namespace' in 'module_2'.
  • CS0439: Errore: una dichiarazione alias extern deve precedere tutti gli altri elementi definiti nello spazio dei nomi.
  • CS0518: Errore: il tipo predefinito 'type' non è definito o importato.
  • CS0576: Errore: lo spazio dei nomi 'namespace' contiene una definizione in conflitto con l'alias 'identifier'.
  • CS0687: Errore: il qualificatore di alias :: dello spazio dei nomi viene sempre risolto in un tipo o in uno spazio dei nomi, quindi non è valido qui. Si consiglia di utilizzare . al suo posto.
  • CS1022: Errore: tipo, definizione dello spazio dei nomi o fine del file previsto.
  • CS1529: Errore: la clausola using deve precedere tutti gli altri elementi definiti nello spazio dei nomi ad eccezione delle dichiarazioni di alias extern.
  • CS1537: Errore: l’alias using 'alias' è già presente in questo spazio dei nomi.
  • CS1671: Errore: una dichiarazione dello spazio dei nomi non può avere modificatori o attributi.
  • CS1679: Errore: Alias extern non valido per '/reference'; 'identifier' non è un identificatore valido.
  • CS1680: Errore: Opzione alias riferimento non valida: 'alias=' -- nome file mancante.
  • CS1681: Errore: non è possibile ridefinire l'alias extern globale.
  • CS1730: Errore: gli attributi assembly e modulo devono precedere tutti gli altri elementi definiti in un file, ad eccezione delle clausole e delle dichiarazioni alias extern.
  • CS2034: Errore: un'opzione /reference che dichiara un alias extern può avere un solo nome file. Per specificare più alias o nomi di file, usare più opzioni /reference.
  • CS7000: Errore: uso imprevisto di un nome con alias.
  • CS7007: Errore: una using static direttiva può essere applicata solo ai tipi. Si consideri invece una using namespace direttiva.
  • CS7015: Errore: 'alias extern' non valido in questo contesto.
  • CS7021: Errore: Impossibile dichiarare lo spazio dei nomi nel codice script.
  • CS8083: Errore: un nome qualificato come alias non è un'espressione.
  • CS8085: Errore: non è possibile usare una direttiva 'using static' per dichiarare un alias.
  • CS8914: Errore: una direttiva using globale non può essere usata in una dichiarazione dello spazio dei nomi.
  • CS8915: Errore: una direttiva using globale deve precedere tutte le direttive using non globali.
  • CS8954: Errore: il file di origine può contenere solo una dichiarazione di spazio dei nomi a livello di file.
  • CS8955: Errore: il file di origine non può contenere sia dichiarazioni di namespace a livello di file che normali.
  • CS8956: Errore: lo spazio dei nomi a livello di file deve precedere tutti gli altri membri in un file.
  • CS9130: Errore: using alias non può essere un tipo ref.
  • CS9131: Errore: solo un using alias può essere unsafe.
  • CS9132: Errore: using alias non può essere un tipo riferimento nullable.
  • CS9133: Errore: il modificatore static deve precedere il modificatore unsafe.
  • CS9162: Tipo non valido per 'using static'. È possibile usare solo una classe, struct, interfaccia, enumerazione, delegato o namespace.

E i seguenti avvisi del compilatore:

  • CS0105: Avviso: la direttiva using per 'namespace' è già presente in questo spazio dei nomi.
  • CS0435: Avviso: lo spazio dei nomi 'namespace' in 'assembly' è in conflitto con il tipo importato 'type' in 'assembly'. Uso dello spazio dei nomi definito in 'assembly'.
  • CS0436: avviso: il tipo 'type' in 'assembly' è in conflitto con il tipo importato 'type2' in 'assembly'. Uso del tipo definito in 'assembly'.
  • CS0437: Avviso: il tipo 'type' in 'assembly2' è in conflitto con lo spazio dei nomi importato 'namespace' in 'assembly1'. Viene utilizzato il tipo definito in 'assembly'.
  • CS0440: Avviso: si consiglia di non assegnare il nome global a un alias perché global:: fa sempre riferimento allo spazio dei nomi globale e non a un alias.
  • CS8019: Informazione: direttiva using non necessaria.
  • CS8020: Info: alias extern inutilizzato.
  • CS8933: Info: la direttiva using è già presente come using globale.

Questi errori e avvisi indicano problemi con le direttive using, le dichiarazioni dello spazio dei nomi o i conflitti di denominazione tra tipi e spazio dei nomi. Le sezioni seguenti descrivono questi errori e come correggerli.

direttiva using

Gli errori seguenti sono correlati alle using direttive:

  • CS0105: La direttiva using per 'namespace' è apparsa in precedenza in questo namespace.
  • CS0430: l'alias extern 'alias' non è stato specificato in un'opzione /reference.
  • CS0439: una dichiarazione alias extern deve precedere tutti gli altri elementi definiti nello spazio dei nomi.
  • CS1529: una clausola using deve precedere tutti gli altri elementi definiti nello spazio dei nomi ad eccezione delle dichiarazioni alias extern.
  • CS1679: alias extern non valido per '/reference'; 'identifier' non è un identificatore valido.
  • CS1680: opzione alias riferimento non valida: 'alias=' -- nome file mancante.
  • CS1681: non è possibile ridefinire l'alias extern globale.
  • CS1730: gli attributi assembly e modulo devono precedere tutti gli altri elementi definiti in un file, ad eccezione delle clausole e delle dichiarazioni alias extern.
  • CS2034: un'opzione /reference che dichiara un alias extern può avere un solo nome file. Per specificare più alias o nomi di file, usare più opzioni /reference.
  • CS7015: "alias extern" non è valido in questo contesto.
  • CS8019: direttiva using non necessaria.
  • CS8020: alias extern inutilizzato.
  • CS8933: La direttiva using è apparsa in precedenza come direttiva "using globale".

Vedere le informazioni di riferimento sulla direttiva using e sul linguaggio alias extern per le regole che regolano la diagnostica. Le possibili correzioni includono:

  • Spostare tutte le using direttive all'inizio del file o all'inizio della dichiarazione del namespace. Il linguaggio C# richiede using che le direttive vengano fornite prima di altri elementi in uno spazio dei nomi (CS1529).
  • Spostare tutte le extern alias dichiarazioni prima di qualsiasi using direttiva. Il linguaggio richiede che gli alias extern vengano prima di tutti gli altri elementi, incluse le direttive using (CS0439, CS7015).
  • Sposta tutti gli attributi a livello di assembly e modulo dopo le clausole using e le dichiarazioni extern alias, ma prima di qualsiasi dichiarazione di tipo. Gli attributi devono seguire le direttive ma precedono i tipi (CS1730).
  • Assicurarsi che ogni extern alias dichiarazione nel codice sorgente abbia un alias corrispondente definito nelle opzioni di riferimento del progetto. Il compilatore non riesce a risolvere un alias non specificato (CS0430).
  • Usare un'opzione separata /reference per ogni alias extern anziché combinare più alias in un'unica opzione. Il compilatore richiede un alias per ogni opzione di riferimento (CS2034).
  • Verificare che l'alias nell'opzione /reference sia un identificatore C# valido. L'alias deve seguire le regole di denominazione degli identificatori (CS1679). Includere un nome file dopo il segnale = nell'opzione di riferimento dell'alias. Il compilatore deve conoscere l'assembly a cui fa riferimento l'alias (CS1680).
  • Non tentare di ridefinire l'alias global extern. global è un alias predefinito che fa riferimento a tutti i riferimenti non associati (CS1681).
  • Rimuovere le direttive duplicate using . Il compilatore avvisa quando lo stesso spazio dei nomi viene importato più volte (CS0105, CS8019, CS8933).
  • Rimuovere le dichiarazioni inutilizzate extern alias . Il compilatore rilascia una diagnostica quando un alias extern viene dichiarato ma non viene mai fatto riferimento nel codice (CS8020).

Utilizzo della direttiva "using static"

Gli errori seguenti sono correlati alle using static direttive:

  • CS0138: Una direttiva 'using namespace' può essere applicata solo ai namespace; 'type' è un tipo, non un namespace.
  • CS7007: una using static direttiva può essere applicata solo ai tipi. Si consideri invece una using namespace direttiva.
  • CS9133: static modificatore deve precedere unsafe modificatore.
  • CS9162: il tipo non è valido per 'using static'. È possibile usare solo una classe, uno struct, un'interfaccia, un'enumerazione, un delegato o uno spazio dei nomi.

Vedi il riferimento al linguaggio della using static directive per le regole che regolano queste diagnosi. Le possibili correzioni includono:

  • Aggiungere il modificatore static quando si importano direttamente i membri di un tipo, perché omettere static indica al compilatore che si sta importando uno spazio dei nomi anziché un tipo (CS0138).
  • Rimuovere il modificatore static durante l'importazione di uno spazio dei nomi, perché using static può essere applicato solo ai tipi, non agli spazi dei nomi (CS7007). Verificare che la destinazione di una using static direttiva sia una classe, uno struct, un'interfaccia, un'enumerazione o un delegato, perché altri tipi non sono destinazioni valide per le importazioni statiche (CS9162).
  • Posizionare il modificatore static prima del modificatore unsafe quando si combinano entrambi, perché il linguaggio richiede modificatori in un ordine specifico (CS9133).

Direttiva global using

Gli errori seguenti sono correlati alle global using direttive:

  • CS8914: una direttiva using globale non può essere utilizzata in una dichiarazione di namespace.
  • CS8915: una direttiva using globale deve precedere tutte le direttive using non globali.

Vedere le informazioni di riferimento sul linguaggio di direttiva using globale per le regole che regolano la diagnostica. Le possibili correzioni includono:

  • Spostare global using le direttive all'esterno di qualsiasi dichiarazione dello spazio dei nomi per portarle all'ambito del file, perché gli using globali si applicano a livello di progetto e non possono essere ristretti a uno spazio dei nomi (CS8914).
  • Inserire tutte le global using direttive prima di qualsiasi direttiva non globale using nel file, perché il linguaggio richiede direttive globali per precedere quelle locali (CS8915).
  • Si noti che una static global using direttiva non può fare riferimento a un tipo locale di file .

Spazio dei nomi con ambito limitato al file

Gli errori seguenti sono correlati agli spazi dei nomi definiti a livello di file.

  • CS8954: il file di origine può contenere solo una dichiarazione di spazio dei nomi file-scoped.
  • CS8955: Il file di origine non può contenere sia dichiarazioni di spazio dei nomi a livello di file che dichiarazioni normali.
  • CS8956: Il file-scoped namespace deve precedere tutti gli altri elementi in un file.

Vedere le informazioni di riferimento sul linguaggio dello spazio dei nomi con ambito file per le regole che regolano la diagnostica. Le possibili correzioni includono:

  • Usare una sola dichiarazione dello spazio dei nomi con ambito file per ogni file, perché il linguaggio consente solo a un singolo spazio dei nomi con ambito file di impostare lo spazio dei nomi per tutti i tipi in un file (CS8954).
  • Scegli tra le dichiarazioni di namespace con ambito file o di blocco all'interno di un singolo file, in quanto il linguaggio non consente di combinare entrambi gli stili (CS8955).
  • Spostare la dichiarazione dello spazio dei nomi con ambito file prima di qualsiasi dichiarazione di tipo, perché lo spazio dei nomi deve essere stabilito prima che i tipi vengano dichiarati (CS8956).

Qualificatore alias

Gli errori seguenti sono correlati al qualificatore alias:

  • CS0431: Impossibile usare l'alias 'identifier' con :: perché l'alias fa riferimento a un tipo. Usare . invece.
  • CS0432: alias 'identifier' non trovato.
  • CS0440: la definizione di un alias denominato global non è consigliata perché global:: fa sempre riferimento allo spazio dei nomi globale e non a un alias.
  • CS0687: Il qualificatore alias dello spazio dei nomi viene sempre risolto in un tipo o in uno spazio dei nomi, pertanto non è consentito qui. Si consiglia invece di usare ..
  • CS7000: uso imprevisto di un nome con alias.
  • CS8083: un nome completo di alias non è un'espressione.

Vedere le informazioni di riferimento sul linguaggio del qualificatore alias dello spazio dei nomi per le regole che regolano la diagnostica. Le possibili correzioni includono:

  • Sostituire l'operatore :: con l'operatore . quando si accede ai membri di un alias di tipo, perché il qualificatore :: è valido solo per alias di spazi dei nomi, non per gli alias di tipo (CS0431, CS0687).
  • Verificare che l'alias a cui si fa riferimento sia dichiarato con una using direttiva o extern alias, perché il compilatore non è in grado di risolvere un alias non definito (CS0432).
  • Usare il qualificatore alias solo nei contesti in cui ci si aspetta un nome di tipo o di spazio dei nomi, perché i nomi qualificati con alias non sono validi come espressioni (CS7000, CS8083).
  • Scegliere un nome diverso per l'alias anziché global, perché global è riservato per fare riferimento allo spazio dei nomi globale e non può essere ridefinito (CS0440).

Uso delle restrizioni degli alias

Gli errori seguenti si riferiscono alle restrizioni relative all'uso degli alias:

  • CS0576: spazio dei nomi 'namespace' contiene una definizione in conflitto con l'alias 'identifier'.
  • CS1537: l'uso dell'alias 'alias' è apparso in precedenza in questo spazio dei nomi.
  • CS8085: una direttiva 'using static' non può essere usata per dichiarare un alias.
  • CS9130: L'alias non può essere un ref tipo.
  • CS9131: Solo un alias using può essere unsafe.
  • CS9132: l'uso dell'alias non può essere un tipo di riferimento nullable.

Vedere il riferimento del linguaggio using alias per le regole che disciplinano le diagnostiche. Le possibili correzioni includono:

  • Scegliere un nome univoco per l'alias che non entri in conflitto con i nomi di tipo o namespace esistenti nell'ambito, perché il compilatore non è in grado di distinguerli (CS0576).
  • Usare ogni nome alias una sola volta all'interno di uno spazio dei nomi, perché le dichiarazioni alias duplicate creano ambiguità (CS1537).
  • Rimuovere il static modificatore quando si dichiara un alias, perché gli alias e le importazioni statiche si escludono a vicenda: usare using static per importare membri o using Alias = per creare un alias, ma non entrambi insieme (CS8085).

A partire da C# 12, le restrizioni seguenti si applicano all'uso degli alias:

  • Non usare ref, in o out modificatori in un using alias, perché questi modificatori di parametro non sono validi nei contesti di alias di tipo (CS9130).
  • Usare il unsafe modificatore solo con alias che fanno riferimento ai tipi di puntatore o con using static direttive, perché unsafe senza un alias o un'importazione statica non è consentito (CS9131).
  • Usare un tipo riferimento non nullable durante la creazione di un alias a un tipo riferimento, perché i tipi riferimento nullable non possono essere aliasati direttamente (CS9132).

Dichiarazioni di namespace

Gli errori seguenti si riferiscono alle regole di dichiarazione dello spazio dei nomi:

  • CS0116: uno spazio dei nomi non può contenere direttamente membri, ad esempio campi, metodi o istruzioni.
  • CS1022: Definizione di tipo o spazio dei nomi, o fine del file prevista.
  • CS1671: una dichiarazione dello spazio dei nomi non può avere modificatori o attributi.
  • CS7021: Impossibile dichiarare lo spazio dei nomi nel codice di script.

Vedere la parola chiave dello spazio dei nomi e la struttura generale di un linguaggio di programma C# per le regole che regolano la diagnostica. Le possibili correzioni includono:

  • Assicurarsi che tutti i metodi, i campi e le proprietà siano dichiarati all'interno di un tipo (classe, struct, record o interfaccia) anziché direttamente all'interno di uno spazio dei nomi, perché gli spazi dei nomi possono contenere solo dichiarazioni di tipo, spazi dei nomi annidati e using direttive (CS0116).
  • Verificare la presenza di parentesi graffe non corrispondenti nel file di origine, perché una parentesi graffa di chiusura non corrispondente aggiuntiva dopo un namespace o una definizione di tipo genera un errore quando il compilatore rileva contenuto non previsto alla fine del file (CS1022).
  • Rimuovere eventuali modificatori di accesso o attributi dalle dichiarazioni dello spazio dei nomi, perché gli spazi dei nomi non supportano modificatori come public o privatee gli attributi non possono essere applicati a essi (CS1671).
  • Spostare le dichiarazioni dello spazio dei nomi dai file di script C# (.csx) e nei normali file di origine (.cs), perché il codice script valuta in un singolo contesto di esecuzione che non supporta le dichiarazioni dello spazio dei nomi (CS7021).

Conflitti di denominazione dello spazio dei nomi e dei tipi

Gli errori e gli avvisi seguenti riguardano i conflitti di denominazione tra namespace e tipi.

  • CS0104: 'reference' è un riferimento ambiguo tra 'identifier' e 'identifier'.
  • CS0434: lo spazio dei nomi NamespaceName1 in NamespaceName2 è in conflitto con il tipo TypeName1 in NamespaceName3.
  • CS0435: Lo spazio dei nomi 'namespace' in 'assembly' è in conflitto con il tipo importato 'type' in 'assembly'. Verrà utilizzato lo spazio dei nomi definito in 'assembly'.
  • CS0436: il tipo 'type' in 'assembly' è in conflitto con il tipo importato 'type2' in 'assembly'. Uso del tipo definito in 'assembly'.
  • CS0437: Il tipo 'type' nel 'assembly2' è in conflitto con lo spazio dei nomi importato 'namespace' nel 'assembly1'. Verrà utilizzato il tipo definito in 'assembly'.
  • CS0438: il tipo 'type' in 'module_1' è in conflitto con lo spazio dei nomi 'namespace' in 'module_2'.

Vedere la direttiva using, alias extern e il riferimento al linguaggio qualificatore di alias dello spazio dei nomi per le regole che governano queste diagnostiche. Le possibili correzioni includono:

  • Usare un nome qualificato completo o un alias dello spazio dei nomi quando il codice fa riferimento a un nome presente in più spazi dei nomi importati.
  • Il compilatore non è in grado di determinare il tipo che si intende usare quando lo stesso nome viene visualizzato in due o più spazi dei nomi importati dalle using direttive (CS0104).
  • Rinominare il tipo o lo spazio dei nomi quando un tipo importato e uno spazio dei nomi annidato importato condividono lo stesso nome completo. Il compilatore non può distinguere tra di essi quando viene fatto riferimento al nome (CS0434, CS0438).

Per risolvere gli avvisi di conflitto di denominazione, rinominare una delle dichiarazioni in conflitto, usare uno spazio dei nomi diverso, rimuovere il riferimento all'assembly non necessario o usare un alias extern per disambiguare tra le due definizioni. Il compilatore risolve automaticamente questi conflitti, usando lo spazio dei nomi definito localmente sul tipo importato (CS0435), il tipo definito localmente sul tipo importato (CS0436) o il tipo definito localmente sullo spazio dei nomi importato (CS0437), ma gli avvisi indicano una potenziale fonte di confusione da risolvere.

Importazioni di tipi predefinite

L'errore seguente si riferisce alle definizioni di tipi predefinite mancanti:

  • CS0518: il tipo predefinito 'type' non è definito o importato.

Annotazioni

Questo avviso viene segnalato solo durante le operazioni di compilazione o ricompilazione esplicite. Non viene visualizzato durante la digitazione nell'IDE come parte della diagnostica di IntelliSense. Ciò significa che se si corregge l'avviso usando il campo o rimuovendolo, l'avviso potrebbe persistere nell'elenco degli errori fino a quando non si compila o si ricompila nuovamente il progetto.

Per le regole che regolano questa diagnostica, vedere le informazioni di riferimento sul linguaggio delle opzioni del compilatore NoStandardLib .

Verificare che il progetto sia destinato al runtime .NET corretto. Tipi predefiniti come System.Int32 e System.String provengono dalla libreria di runtime. Una specifica errata o mancante <TargetFramework> impedisce al compilatore di trovare questi tipi (CS0518). Verificare che la <TargetFramework> proprietà nel .csproj file specifichi il runtime previsto , ad esempio net10.0. Non specificare l'opzione del compilatore NoStandardLib a meno che non si intenda definire uno spazio dei nomi personalizzato System . Questa opzione impedisce l'importazione della libreria standard che definisce tutti i tipi predefiniti (CS0518). Se l'errore persiste, provare a ricaricare il progetto in Visual Studio, eliminare le obj cartelle e bin e ricompilare il progetto o reinstallare il runtime .NET (CS0518).