Risolvere gli avvisi correlati all’uso degli spazi dei nomi

Questo articolo illustra gli errori del compilatore seguenti:

  • CS0138: Errore: una direttiva using namespace può essere applicata solo agli spazi dei nomi. 'Type' è un tipo, non uno spazio dei nomi.
  • CS0431: Non è possibile usare l'alias 'identifier' con :: perché l'alias fa riferimento a un tipo. Usare ., in alternativa.
  • CS0432: Errore: alias 'identifier' non trovato.
  • 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 e non è pertanto valido in questa posizione. Prendere in considerazione l’uso di ., in alternativa.
  • 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.
  • CS7000: Errore: uso imprevisto di un nome con alias.
  • CS7007: Errore: una direttiva using staticpuò essere applicata solo ai tipi. Prendere in considerazione una direttivausing namespace, in alternativa
  • 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.
  • CS9055: Errore: un tipo locale di file non può essere usato in una direttiva 'global using static'.
  • CS9130: Errore: using alias non può essere un tipo ref.
  • CS9131: Errore: solo 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 classi, struct, interfacce, enumerazioni, delegati o spazi dei nomi.

Inoltre, è possibile usare gli avvisi del compilatore seguenti:

  • CS0105: Avviso: la direttiva using per 'namespace' è già presente in questo spazio dei nomi.
  • 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: Info: direttiva using non necessaria.
  • CS8933: Info: la direttiva using è già presente come using globale.

Questi errori e avvisi indicano che la direttiva using non è stata formata correttamente. Le sezioni seguenti illustrano tali errori e come correggerli.

Direttiva using

La direttiva using deve precedere qualsiasi altro elemento in una dichiarazione namespace o qualsiasi altra dichiarazione namespace nel file. L'inserimento di una direttiva using in un secondo momento nel file causa la generazione dell'errore CS1529 da parte del compilatore:

namespace UsingDirective;
public class MyClass
{
}

using System.Text.Json; // CS1529

Per risolvere questo problema, spostare le dichiarazioni using all'inizio del file o dello spazio dei nomi:

using System.Text.Json;
namespace UsingDirective;
public class MyClass
{
}

Il compilatore genera l'avviso CS8933, CS0105 o la diagnostica CS8019 per una direttiva using duplicata da una direttiva using o global using. È possibile rimuovere eventuali duplicati.

La combinazione errata di una direttiva using con i modificatori static, globalo unsafe in una direttiva usingviene descritta più avanti in questo articolo.

Direttiva using static

La direttiva using static importa i membri di un tipo nello spazio dei nomi corrente. Nell'esempio seguente vengono importati i metodi da System.Console, ad esempio WriteLine nello spazio dei nomi corrente:

using static System.Console;

Il compilatore genera l'errore CS0138 se si omette il modificatore static:

using System.Console; // CS0138

Il compilatore genera l'errore CS7007 se si include lo spazio dei nomi di importazione del modificatore static anziché un tipo:

using static System; // CS7007

Il compilatore genera l’errore CS9162 se il simbolo non è uno dei tipi appropriati.

Se si combina il modificatore static con il modificatoreunsafe in una direttiva using, il modificatore static deve essere il primo:

using static unsafe UnsafeExamples.UnsafeType;

Direttiva using global

Una direttiva global using importa lo spazio dei nomi o il tipo in tutti i file di origine nel progetto corrente:

global using System.Text;

Tutte le direttive global using devono precedere le direttive non-global using nel file di origine e non devono essere inserite in un namespace. In questo modo si ottengono, rispettivamente, CS8915 e CS8914.

Inoltre, una direttiva static global usingnon può fare riferimento a un tipo di file-locale.

Qualificatore alias

Il qualificatore alias :: precede un alias dello spazio dei nomi o segue l'alias global. Se si usa :: al posto di . per separare gli elementi di un nome completo, il compilatore genera un errore CS0431, CS0432, CS0687, *CS7000o CS8083.

In tutti i casi sostituire il :: con il separatore ..

Inoltre, se si definisce un alias denominato global, il compilatore genera un errore CS0440. L'alias global fa sempre riferimento allo spazio dei nomi globale. La dichiarazione di un alias a tale scopo è errato ed è necessario scegliere un nome diverso per l'alias.

Conflitti tra nomi di alias

È possibile dichiarare un alias in uno spazio dei nomi o in un tipo con una direttiva using:

using JSON = System.Text.Json;
using ValueMap = System.Collections.Generic.Dictionary<string, decimal>;
using TimedData = (System.DateTime timeRecorded, decimal value);

È consigliabile provare a creare un nome univoco per l'alias, ovvero il nome a sinistra dell'accesso = negli esempi precedenti. L'uso di un nome già mappato a un tipo (ad esempio Object) o a uno spazio dei nomi (System) può causare un errore CS0576 o CS1537.

Restrizioni sull'uso di alias

Prima di C# 12, il linguaggio imponeva le restrizioni seguenti alle direttive using che creano un alias per una dichiarazione di tipo:

  • Non è possibile creare un alias con una direttiva using static:

    using static con = System.Console;
    using static unsafe ip = int*;
    

A partire da C# 12, vengono introdotte le restrizioni seguenti:

  • Non è possibile usare i modificatori in, ref o out in un using alias:

    // All these are invalid
    using RefInt = ref int;
    using OutInt = out int;
    using InInt = in int;
    
  • Una direttiva using unsafedeve specificare un alias o un static using:

    // Elsewhere:
    public namespace UnsafeExamples
    {
        public unsafe static class UnsafeType
        {
            // ...
        }
    }
    
    // Using directives:
    using unsafe IntPointer = int*;
    using static unsafe UnsafeExamples.UnsafeType;
    using unsafe UnsafeExamples; // not allowed
    
  • Non è possibile creare un alias per un tipo riferimento nullable:

    using NullableInt = System.Int32?; // Allowed
    using NullableString = System.String?; // Not allowed