Errore del compilatore CS0246

Il nome di tipo o di spazio dei nomi 'type/namespace' non è stato trovato. Probabilmente manca una direttiva using o un riferimento all'assembly.

Non è stato trovato un tipo o uno spazio dei nomi usato nel programma. Potrebbe essere stato dimenticato di fare riferimento (riferimenti) all'assembly che contiene il tipo oppure potrebbe non essere stata aggiunta la direttiva using richiesta. In alternativa, potrebbe esserci un problema con l'assembly cui si intende fare riferimento.

Le situazioni seguenti possono provocare l'errore del compilatore CS0246.

  • Il nome del tipo o dello spazio dei nomi non è stato digitato correttamente. Senza il nome corretto, il compilatore non può trovare la definizione per il tipo o per lo spazio dei nomi. Questo problema è spesso dovuto al fatto che il nome è stato specificato con maiuscole o minuscole non corrette. Ad esempio, Dataset ds; genera l'errore CS0246 perché la "s" in Dataset deve essere maiuscola.

  • Se l'errore riguarda un nome dello spazio dei nomi, è stato aggiunto un riferimento (Riferimenti) all'assembly che contiene lo spazio dei nomi? Ad esempio, il codice potrebbe contenere la direttiva using Accessibility. Tuttavia, se il progetto non fa riferimento all'assembly Accessibility.dll, viene segnalato l'errore CS0246. Per altre informazioni, vedere Gestione dei riferimenti in un progetto

  • Se l'errore riguarda il nome di un tipo, verificare di aver incluso la direttiva using corretta o, in alternativa, che il nome del tipo sia completo. Considerare la dichiarazione seguente: DataSet ds. Per usare il tipo DataSet , sono necessari due elementi. Prima di tutto, è necessario un riferimento all'assembly che contenga la definizione per il tipo DataSet . Quindi, è necessaria una direttiva using per lo spazio dei nomi in cui si trova DataSet . Ad esempio, poiché DataSet si trova nello spazio dei nomi System.Data , è necessaria la direttiva seguente all'inizio del codice: using System.Data.

    La direttiva using non è necessaria. Tuttavia, se viene omessa, è necessario specificare il tipo DataSet in modo completo quando vi si fa riferimento. Un nome di tipo completo significa che è necessario specificare sia lo spazio dei nomi sia il tipo ogni volta che si fa riferimento al tipo nel codice. Se si omette la direttiva using nell'esempio precedente, è necessario scrivere System.Data.DataSet ds in modo da dichiarare ds invece di DataSet ds.

  • È stato usato un elemento del linguaggio o una variabile in cui è previsto un tipo Ad esempio, se in un'istruzione is si usa un oggetto Type invece di un tipo effettivo, si ottiene l'errore CS0246.

  • È stato fatto riferimento all'assembly che è stato compilato in base a una versione di .NET Framework più recente rispetto alla versione del framework di destinazione del programma. Oppure è stato fatto riferimento al progetto che è destinato a una versione di .NET Framework più recente rispetto alla versione del framework di destinazione del programma. Ad esempio, si usa il progetto destinato a .NET Framework 4.6.1 e si usa il tipo del progetto destinato a .NET Framework 4.7.1. Verrà visualizzato l'errore CS0246.

  • Tutti i progetti a cui si fa riferimento sono inclusi nella configurazione e nella piattaforma di compilazione selezionata? Usare il Configuration Manager di Visual Studio per assicurarsi che tutti i progetti a cui si fa riferimento siano contrassegnati per la compilazione con la configurazione e la piattaforma selezionate.

  • È stata usata una direttiva alias using senza specificare un nome di tipo completo Una direttiva alias using non usa le direttive using nel file del codice sorgente per risolvere i tipi. L'esempio seguente genera l'errore CS0246 perché il tipo List<int> non è completo. La direttiva using per System.Collections.Generic non previene l'errore.

    using System.Collections.Generic;  
    
    // The following declaration generates CS0246.  
    using myAliasName = List<int>;
    
    // To avoid the error, fully qualify List.  
    using myAliasName2 = System.Collections.Generic.List<int>;  
    

    Se si ottiene questo errore in un frammento di codice che prima funzionava, cercare prima di tutto eventuali riferimenti mancanti o non risolti in Esplora soluzioni. È necessario reinstallare un pacchetto NuGet ? Per informazioni sul modo in cui il sistema di compilazione cerca i riferimenti, vedere l'articolo sulla risoluzione di riferimenti a file in Team Build. Se tutti i riferimenti sembrano corretti, esaminare la cronologia del controllo del codice sorgente per individuare che cosa è cambiato nel file con estensione csproj e/o nel file di origine locale.

    Se non è stato ancora possibile accedere correttamente al riferimento, usare Visualizzatore oggetti per esaminare l'assembly che dovrebbe contenere lo spazio dei nomi e verificare che questo sia effettivamente presente. Se si verifica in Visualizzatore oggetti che l'assembly contiene lo spazio dei nomi, provare a rimuovere la direttiva using e controllare se vi sono altre interruzioni nel codice. Il problema principale potrebbe essere provocato da un altro tipo in un assembly diverso.

L'esempio seguente genera l'errore CS0246 perché manca una direttiva using necessaria.

// CS0246.cs  
//using System.Diagnostics;  
  
public class MyClass  
{  
    // The following line causes CS0246. To fix the error, uncomment  
    // the using directive for the namespace for this attribute,  
    // System.Diagnostics.  
    [Conditional("A")]  
    public void Test()  
    {  
    }  
  
    public static void Main()  
    {  
    }  
}  

L'esempio seguente provoca l'errore CS0246 perché è stato usato un oggetto di tipo Type in un punto in cui è previsto l'uso di un tipo effettivo.

// CS0246b.cs  
using System;  
  
class ExampleClass  
{  
    public bool supports(object o, Type t)  
    {  
        // The following line causes CS0246. You must use an  
        // actual type, such as ExampleClass, String, or Type.  
        if (o is t)  
        {  
            return true;  
        }  
        return false;  
    }  
}  
  
class Program  
{  
    public static void Main()  
    {  
        ExampleClass myC = new ExampleClass();  
        myC.supports(myC, myC.GetType());  
    }  
}