Resolver avisos relacionados ao uso de namespaces

Este artigo aborda os seguintes avisos do compilador:

  • CS0138: Erro: uma diretiva de namespace using só pode ser aplicada a namespaces; “type” é um tipo, não é um namespace.
  • CS0431: Erro: não é possível usar o alias "identifier" com ::, pois o alias faz referência a um tipo. Use . em seu lugar .
  • CS0432: Erro: alias “identifier” não encontrado.
  • CS0576: Erro: o namespace “namespace” contém uma definição conflitante com o alias “identifier”.
  • CS0687: Erro: o qualificador alias de namespace :: sempre é resolvido em um tipo ou namespace, por isso, é inválido aqui. Considere usar . em vez disso.
  • CS1529: Erro: a cláusula using deve preceder todos os outros elementos definidos no namespace, exceto as declarações de alias externos.
  • CS1537: Erro: o alias using “alias” apareceu anteriormente neste namespace.
  • CS7000: Erro: uso inesperado de um nome com alias.
  • CS7007: Erro: uma diretiva using static só pode ser aplicada aos tipos. Considere uma diretiva using namespace em vez disso
  • CS8083: Erro: um nome qualificado para alias não é uma expressão.
  • CS8085: Erro: uma diretiva “using static” não pode ser usada para declarar um alias.
  • CS8914: Erro: uma diretiva using global não pode ser usada em uma declaração de namespace.
  • CS8915: Erro: uma diretiva using global deve preceder todas as diretivas using não globais.
  • CS9055: Erro: o tipo de arquivo local não pode ser usado em uma diretiva “global using static”.
  • CS9130: Erro: o alias using não pode ser um tipo ref.
  • CS9131: Erro: somente um alias using pode ser unsafe.
  • CS9132: Erro: o alias using não pode ser um tipo de referência anulável.
  • CS9133: Erro: o modificador static deve preceder o modificador unsafe.
  • CS9162: o tipo não é válido para "using static". Somente uma classe, struct, interface, enumeração, delegado ou namespace pode ser usado.

E os seguintes avisos do compilador:

  • CS0105: Aviso: a diretiva using para “namespace” apareceu anteriormente nesse namespace.
  • CS0440: Aviso: a definição de um alias denominado global não é recomendável, pois global:: sempre faz referência ao namespace global e não a um alias.
  • CS8019: Informação: diretiva using desnecessária.
  • CS8933: Informação: A diretiva using apareceu anteriormente como using global.

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

Diretiva using

A diretiva using deve preceder outros elementos em uma declaração namespace ou antes de qualquer declaração namespace no arquivo. Colocar uma diretiva using depois 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 as declarações using 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 os avisos CS8933, CS0105 ou o diagnóstico CS8019 para uma diretiva using duplicada em uma diretiva using ou global using. Você pode remover todas as duplicatas.

A combinação incorreta de uma diretiva using com os modificadores static, global ou unsafe em uma diretiva using é abordada posteriormente neste artigo.

Diretiva using static

A diretiva using static importa os 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 gerará CS0138 se você omitir o modificador static:

using System.Console; // CS0138

O compilador gerará CS7007 se você incluir o namespace de importação do modificador static em vez de um tipo:

using static System; // CS7007

O compilador emitirá CS9162 se o símbolo não for um dos tipos apropriados.

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

using static unsafe UnsafeExamples.UnsafeType;

Diretiva de uso global

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

global using System.Text;

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

Além disso, uma diretiva static global using não pode referenciar um tipo local de arquivo.

Qualificador de alias

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

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

Além disso, se você definir um alias chamado global, o compilador emitirá CS0440. O alias global 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 nome 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);

Tente criar um nome exclusivo para o alias, o nome à esquerda da entrada = nos exemplos anteriores. Usar um nome que já está mapeado para um Tipo (por exemplo Object) ou um namespace (System) pode causar CS0576 ou CS1537.

Restrições ao uso de aliases

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

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

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

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

  • Você não pode usar os modificadores in, ref ou out em um alias usando:

    // All these are invalid
    using RefInt = ref int;
    using OutInt = out int;
    using InInt = in int;
    
  • Uma diretiva using unsafe 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