Erro do Compilador CS0246

O nome do tipo ou do namespace 'tipo/namespace' não pode ser encontrado (está faltando uma diretiva using ou uma referência de assembly?)

Não foi encontrado um tipo ou um namespace usado no programa. Talvez você tenha esquecido de referenciar (Referências) o assembly que contém o tipo ou talvez não tenha adicionado a diretiva de uso necessária. Ou, pode haver um problema com o assembly que você está tentando fazer referência.

As situações a seguir causam o erro do compilador CS0246.

  • Você digitou incorretamente o nome do tipo ou do namespace? Sem o nome correto, o compilador não pode localizar a definição do tipo ou do namespace. Isso geralmente ocorre porque as maiúsculas e minúsculas usadas no nome do tipo não estão corretas. Por exemplo, Dataset ds; gera o erro CS0246 porque o s de Dataset deve ser colocado em maiúsculas.

  • Se o erro for para um nome de namespace, você adicionou uma referência (Referências) ao assembly que contém o namespace? Por exemplo, seu código pode conter a diretiva using Accessibility. No entanto, se seu projeto não fizer referência ao assembly Accessibility.dll, o erro CS0246 será relatado. Para obter mais informações, consulte Gerenciando referências em um projeto

  • Se o erro for de um nome de tipo, verifique se você incluiu a diretiva using adequada ou, alternativamente, qualificou totalmente o nome do tipo. Considere a seguinte declaração: DataSet ds. Para usar o tipo DataSet, você precisa de duas coisas. Primeiro, você precisa de uma referência ao assembly que contém a definição para o tipo DataSet. Em segundo lugar, você precisa de uma diretiva using para o namespace em que o DataSet está localizado. Por exemplo, como DataSet está localizado no namespace System.Data, você precisa da seguinte diretiva no início do seu código: using System.Data.

    A diretiva using não é necessária. No entanto, se você omitir a diretiva, será necessário qualificar totalmente o tipo DataSet ao fazer referência a ele. Ser totalmente qualificado significa que você especificará o namespace e o tipo todas as vezes em que se referir ao tipo em seu código. Se você omitir a diretiva using no exemplo anterior, deverá escrever System.Data.DataSet ds para declarar ds em vez de DataSet ds.

  • Você usou uma variável ou outro elemento de linguagem no qual era esperado um tipo? Por exemplo, em uma instrução is, se você usar um objeto Type, em vez de usar um tipo, você obterá o erro CS0246.

  • Você fez referência ao assembly que foi criado em uma versão de estrutura mais recente que a versão da estrutura de destino do programa? Ou você fez referência ao projeto que está usando uma versão da estrutura de destino mais recente que aquela do programa? Por exemplo, você trabalha no projeto que tem como destino o .NET Framework 4.6.1 e usa o tipo do projeto que tem como destino o .NET Framework 4.7.1. Você obtém então o erro CS0246.

  • Você usou uma diretiva alias de using sem qualificar totalmente o nome do tipo? Uma diretiva alias de using não usa as diretivas using no arquivo de código-fonte para resolver tipos. O exemplo a seguir gera o erro CS0246 porque o tipo List<int> não está totalmente qualificado. A diretriz using para System.Collections.Generic não impede que o erro.

    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 você obtiver esse erro em um código que funcionava anteriormente, primeiro procure por referências ausentes ou não resolvidas no Gerenciador de Soluções. Você precisa reinstalar um pacote NuGet? Para obter informações sobre como o sistema de build procura por referências, consulte Resolvendo referências de arquivo no build de equipe. Se todas as referências parecem estar corretas, examine o histórico do controle do código-fonte para ver o que mudou no seu arquivo .csproj e/ou no arquivo de origem local.

    Se você ainda não conseguiu acessar a referência, use o Pesquisador de Objetos para inspecionar o assembly que deveria conter este namespace e verifique se o namespace está presente. Se você verificar com o Pesquisador de Objetos que o assembly contém o namespace, tente remover a diretiva using do namespace e veja o que mais será interrompido. A raiz do problema pode ser com outro tipo em outro assembly.

O exemplo a seguir gera o erro CS0246 porque uma diretiva using necessária está ausente.

// 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()  
    {  
    }  
}  

O exemplo a seguir causa o erro CS0246 porque um objeto do tipo Type foi usado, mas era esperado um tipo real.

// 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());  
    }  
}