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 diretivausing 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 modificadorunsafe
. - 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, poisglobal::
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
ouout
em um alias usando:// All these are invalid using RefInt = ref int; using OutInt = out int; using InInt = in int;
Uma diretiva
unsafe using
precisa especificar um alias ou umstatic 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