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 umausing 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 ounsafe
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, poisglobal::
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
, global
ou 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 namespace
arquivo . 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 using
diretiva:
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
,ref
ouout
modificadores em um alias de uso:// All these are invalid using RefInt = ref int; using OutInt = out int; using InInt = in int;
Uma
unsafe using
diretiva deve especificar um pseudônimo 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