Errore del compilatore CS0246

Aggiornamento: Luglio 2008

Messaggio di errore

Impossibile trovare il tipo o il nome dello spazio dei nomi 'tipo/spazio dei nomi'. Probabilmente manca una direttiva using o un riferimento a un assembly.
The type or namespace name 'type/namespace' could not be found (are you missing a using directive or an assembly reference?)

Non è stato trovato un tipo. È possibile che non sia stato inserito un riferimento (/reference) all'assembly contenente il tipo o che il relativo utilizzo non sia stato qualificato correttamente con la direttiva using.

Questo errore può essere determinato da numerose cause:

  • Il nome del tipo o dello spazio dei nomi che si sta tentando di utilizzare potrebbe essere stato digitato in modo errato, ad esempio non rispettando l'esatta combinazione di maiuscole e minuscole. Se non si utilizza il nome corretto, il compilatore non è in grado di trovare la definizione del tipo o dello spazio dei nomi a cui viene fatto riferimento nel codice. Questo problema si verifica quasi sempre perché nel codice C# viene fatta distinzione tra maiuscole e minuscole e nel fare riferimento al tipo non è stata rispettata l'esatta combinazione di maiuscole e minuscole. Dataset ds; genererà ad esempio l'errore CS0246, perché la lettera s in Dataset non è in maiuscolo.

  • Se l'errore è causato dal nome di uno spazio dei nomi, è possibile che non sia stato creato un riferimento (/reference) all'assembly contenente lo spazio dei nomi. È possibile ad esempio che il codice contenga using Accessibility;. Se tuttavia nel progetto non viene fatto riferimento all'assembly Accessibility.dll, verrà restituito l'errore CS0246. Per informazioni su come aggiungere un riferimento nell'ambiente di sviluppo, vedere finestra di dialogo Aggiungi riferimento.

  • Se l'errore è causato dal nome di un tipo, è possibile che non si disponga della direttiva using corretta oppure che il nome del tipo non sia completo. Si consideri la seguente riga di codice: DataSet ds;. Per utilizzare il tipo DataSet è necessario eseguire due operazioni. Occorre innanzitutto fare riferimento all'assembly contenente la definizione del tipo DataSet, quindi è necessaria una direttiva using per lo spazio dei nomi in cui è presente DataSet. Poiché, ad esempio, DataSet è presente nello spazio dei nomi System.Data, all'inizio del codice occorrerà inserire la seguente istruzione: using System.Data;.

  • Il secondo passaggio non è obbligatorio, tuttavia se viene omesso, in seguito sarà necessario fare riferimento al tipo DataSet utilizzando il nome completo. Utilizzare il nome completo significa specificare lo spazio dei nomi e il tipo ogni volta che nel codice viene fatto riferimento al tipo. Se il secondo passaggio è stato ignorato, il codice della dichiarazione sopra indicata dovrà essere modificato in: System.Data.DataSet ds;.

  • Se l'errore è causato da un non tipo, è possibile che sia stata utilizzata una variabile o un altro elemento laddove era previsto un tipo. Questo errore viene restituito, ad esempio, se nell'istruzione is viene utilizzato un oggetto Type anziché un tipo effettivo.

  • If you use a using alias directive and do not fully qualify the type name, this error is generated. A using alias directive does not use other using directives in the source code file to resolve types. For example, the following code generates CS0246 because the type List<int> is not fully qualified, even though a using directive for System.Collections.Generic is present:

    using System.Collections.Generic;
    // Generates CS0246:
    using myAliasName = List<int>; 
    // Does not generate an error:
    using myAliasName2 = System.Collections.Generic.List<int> 
    

Il seguente codice di esempio genera l'errore CS0246:

// CS0246.cs
// using System.Diagnostics;

public class MyClass
{
   [Conditional("A")]   // CS0246, uncomment using directive to resolve
   public void Test()
   {
   }

   public static void Main()
   {
   }
}

Di seguito è riportato un esempio in cui un oggetto di tipo Type è stato utilizzato laddove era previsto un tipo effettivo (caso 4):

// CS0246b.cs
using System;

class C
{
    public bool supports(object o, Type t)
    {
         if (o is t)  // CS0246 – t is not a type
         {
            return true;
         }
         return false;
    }

    public static void Main()
    {
    }
}

Cronologia delle modifiche

Date

History

Motivo

Luglio 2008

Added possible cause for the error.

Miglioramento delle informazioni.