Resolver avisos relacionados usando namespaces

Este artigo aborda os seguintes erros do compilador:

  • CS0138: Erro: Uma diretiva using namespace só pode ser aplicada a namespaces; 'type' é um tipo e não um namespace.
  • CS0431: Erro: Não é possível usar o alias 'identifier' com :: uma vez que o alias faz referência a um tipo. Use . em vez disso.
  • CS0432: Erro: Alias 'identifier' não encontrado.
  • CS0576: Erro: Namespace 'namespace' contém uma definição conflitante com alias 'identifier'.
  • CS0687: Erro: O qualificador :: de alias de namespace sempre resolve para um tipo ou namespace, portanto, é ilegal aqui. Considere usar . em vez disso.
  • CS1529: Erro: Uma cláusula using deve preceder todos os outros elementos definidos no namespace, exceto declarações de alias externas.
  • CS1537: Erro: O alias de uso 'alias' apareceu anteriormente neste namespace.
  • CS7000: Erro: Uso inesperado de um nome com alias.
  • CS7007: Erro: Uma using static diretiva só pode ser aplicada a tipos. Em vez disso, considere uma using namespace diretiva
  • CS8083: Erro: Um nome qualificado por alias não é uma expressão.
  • CS8085: Erro: Uma diretiva 'usando estática' não pode ser usada para declarar um alias.
  • CS8914: Erro: Uma diretiva global using não pode ser usada em uma declaração de namespace.
  • CS8915: Erro: Uma diretiva de uso global deve preceder todas as diretivas de uso não global.
  • CS9055: Erro: Um tipo de arquivo local não pode ser usado em uma diretiva 'global usando estática'.
  • CS9130: Erro: Usar alias não pode ser um ref tipo.
  • CS9131: Erro: Somente um alias de uso pode ser unsafe.
  • CS9132: Erro: Usar alias não pode ser um tipo de referência anulável.
  • CS9133: Erro: static o modificador deve preceder o unsafe modificador.
  • CS9162: Tipo não é válido para 'usar estático'. Somente uma classe, struct, interface, enum, delegado ou namespace pode ser usado.

E os seguintes avisos do compilador:

  • CS0105: Aviso: A diretiva using for 'namespace' apareceu anteriormente neste namespace.
  • CS0440: Aviso: Definir um alias nomeado global é imprudente, pois global:: sempre faz referência ao namespace global e não a um alias.
  • CS8019: Info: Desnecessário usando diretiva.
  • CS8933: Info: A diretiva de uso apareceu anteriormente como uso global.

Esses erros e avisos indicam que using a diretiva não está formada corretamente. As seções a seguir abordam esses erros e como corrigi-los.

Utilização da diretiva

A using diretiva deve preceder quaisquer outros elementos de uma namespace declaração, ou antes de quaisquer namespace declarações no processo. Colocar uma using diretiva posteriormente no arquivo faz com que o compilador produza o erro CS1529:

namespace UsingDirective;
public class MyClass
{
}

using System.Text.Json; // CS1529

Para corrigir esse problema, mova todas using as declarações para a parte superior do arquivo ou para a parte superior do namespace:

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

O compilador produz aviso CS8933, CS0105 ou CS8019 de diagnóstico para uma diretiva duplicada using de uma using diretiva ou global using . Você pode remover quaisquer duplicatas.

A combinação incorreta de uma using diretiva com o static, globalou unsafe modificadores de uma using diretiva são abordados mais adiante neste artigo.

Usando diretiva estática

A using static diretiva importa membros de um tipo para o namespace atual. O exemplo a seguir importa os métodos de System.Console, como WriteLine para o namespace atual:

using static System.Console;

O compilador gera CS0138 se você omitir o static modificador:

using System.Console; // CS0138

O compilador gera CS7007 se você incluir o static modificador importando namespace em vez de um tipo:

using static System; // CS7007

O compilador emite CS9162 se o símbolo não for um dos tipos adequados.

Se você combinar o static modificador com o unsafe modificador em uma using diretiva, o static modificador deve vir primeiro:

using static unsafe UnsafeExamples.UnsafeType;

Diretiva de utilização global

Uma global using diretiva importa o namespace ou digite todos os arquivos de origem no projeto atual:

global using System.Text;

Quaisquer global using diretivas devem preceder quaisquer diretivas não globais using nesse arquivo de origem e não devem ser colocadas em um namespacearquivo . Isso resulta em CS8915 e CS8914, respectivamente.

Além disso, uma static global using diretiva não pode fazer referência a um tipo de arquivo local .

Qualificador de alias

O qualificador de alias, ::, precede um alias de namespace ou segue o global alias. Se você usar :: onde . deve ser usado para separar elementos de um nome totalmente qualificado, o compilador emitirá um de CS0431, CS0432, CS0687, *CS7000 ou CS8083.

Em todos os casos, substitua o :: pelo . separador.

Além disso, se você definir um alias chamado global, o compilador emitirá CS0440. O global alias sempre se refere ao namespace global. Declarar um alias para ele não funciona, e você deve escolher um nome diferente para seu alias.

Conflitos de nomes de alias

Você pode declarar um alias para um namespace ou um tipo com uma diretiva using :

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

Você deve tentar criar um nome exclusivo para o alias, o nome à esquerda do = sinal nos exemplos anteriores. Usar um nome que já mapeia para um Type (por exemplo Object) ou um namespace (System) pode causar CS0576 ou CS1537.

Restrições ao uso de aliases

Antes do C# 12, a linguagem impunha essas restrições às using diretivas que criam um alias para uma declaração de tipo:

  • Não é possível criar um alias com uma using static diretiva:

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

A partir do C# 12, estas restrições são introduzidas:

  • Não é possível usar o in, refou out modificadores em um alias de uso:

    // All these are invalid
    using RefInt = ref int;
    using OutInt = out int;
    using InInt = in int;
    
  • Uma unsafe diretiva de uso deve especificar um alias ou um 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
    
  • Não é possível criar um alias para um tipo de referência anulável:

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