Resolución de advertencias relacionadas con el uso de espacios de nombres
En este artículo se tratan los siguientes errores del compilador:
- CS0138Error: Una directiva de espacio de nombres using solo se puede aplicar a espacios de nombres. ”type” es un tipo, no un espacio de nombres.
- CS0431: Error: No se puede usar el alias ”identifier” con
::
, dado que el alias hace referencia a un tipo. Use en su lugar.
. - CS0432Error: No se encontró el alias ”identifier”.
- CS0576Error: El espacio de nombres ”namespace” contiene una definición que entra en conflicto con el alias ”identifier”..
- CS0687: Error: El calificador de alias del espacio de nombres
::
siempre se resuelve en un tipo o espacio de nombres, por tanto, aquí no es válido. Considere usar en su lugar.
. - CS1529: Error: Una cláusula using debe preceder al resto de elementos definidos en el espacio de nombres, excepto las declaraciones de alias externos.
- CS1537: Error: El alias de using ”alias” aparece previamente en este espacio de nombres.
- CS7000: Error: Uso inesperado de un nombre con alias.
- CS7007: Error: Una directiva
using static
solo se puede aplicar a tipos. Considere en su lugar una directivausing namespace
. - CS8083: Error: Un nombre calificado con el alias no es una expresión.
- CS8085: Error: No se puede usar una directiva ”using static” para declarar un alias.
- CS8914: Error: No se puede usar una directiva using global en una declaración de espacio de nombres.
- CS8915: Error: Una directiva using global debe ser anterior a todas las directivas no globales que no son using.
- CS9055: Error: Un tipo local de archivo no se puede usar en una directiva ”global using static”.
- CS9130: Error: El alias de using no puede ser un tipo
ref
. - CS9131: Error: Solo un alias using puede ser
unsafe
. - CS9132: Error: El alias de using no puede ser un tipo de referencia nula.
- CS9133: Error: El modificador
static
debe preceder al modificadorunsafe
. - CS9162: El tipo no es válido para "using static". Solo se puede usar una clase, estructura, interfaz, enumeración, delegado o espacio de nombres.
Y las siguientes advertencias del compilador:
- CS0105: Advertencia: La directiva using para ”namespace” aparece previamente en este espacio de nombres.
- CS0440: Advertencia: Definir un alias llamado
global
es desacertado dado queglobal::
siempre hace referencia al espacio de nombres global y no a un alias. - CS8019: Información: Directiva using innecesaria.
- CS8933: Información: La directiva using aparecía anteriormente como using global.
Estos errores y advertencias indican que la directiva using
no está formada correctamente. En las secciones siguientes se tratan estos errores y cómo corregirlos.
Directiva using
La directiva using
debe preceder a cualquier otro elemento en una declaración namespace
o antes de cualquier declaración namespace
del archivo. Al colocar una directiva using
más adelante en el archivo, el compilador genera el error CS1529:
namespace UsingDirective;
public class MyClass
{
}
using System.Text.Json; // CS1529
Para corregir este problema, mueva las declaraciones using
a la parte superior del archivo o a la parte superior del espacio de nombres:
using System.Text.Json;
namespace UsingDirective;
public class MyClass
{
}
El compilador genera las advertencias CS8933, CS0105 o CS8019de diagnóstico para una directiva using
duplicada a partir de una directiva using
o global using
. Puede quitar los duplicados.
La combinación incorrecta de una directiva using
con los modificadores static
, global
o unsafe
en una directiva using
se trata más adelante en este artículo.
Directiva using static
La directiva using static
importa los miembros de un tipo en el espacio de nombres actual. En el ejemplo siguiente se importan los métodos de System.Console
, como WriteLine
, en el espacio de nombres actual:
using static System.Console;
El compilador genera CS0138 si se omite el modificador static
:
using System.Console; // CS0138
El compilador genera CS7007 si incluye el espacio de nombres static
de importación del modificador en lugar de un tipo:
using static System; // CS7007
El compilador emite CS9162 si el símbolo no es uno de los tipos adecuados.
Si combina el modificador static
con el modificador unsafe
en una directiva using
, el modificador static
debe aparecer primero:
using static unsafe UnsafeExamples.UnsafeType;
Directiva using global
Una directiva global using
importa el espacio de nombres o el tipo en todos los archivos de origen del proyecto actual:
global using System.Text;
Todas las directivas global using
deben preceder a las directivas no globales using
de ese archivo de origen y no deben colocarse en .namespace
Al hacerlo, se generan CS8915 y CS8914, respectivamente.
Además, una directiva static global using
no puede hacer referencia a un tipo local de archivo.
Calificador de alias
El calificador de alias, ::
, precede a un alias de espacio de nombres o sigue el alias global
. Si usa ::
, donde .
debe usarse para separar elementos de un nombre completo, el compilador emite una de las siguientes advertencias CS0431, CS0432, CS0687, *CS7000 o CS8083.
En todos los casos, reemplace ::
por el separador .
.
Además, si define un alias denominado global
, el compilador emite CS0440. El alias global
siempre hace referencia al espacio de nombres global. Declarar un alias para él no funciona y debe elegir un nombre diferente para el alias.
Conflictos de nombres de alias
Puede declarar un alias para un espacio de nombres o un tipo con una directiva using
:
using JSON = System.Text.Json;
using ValueMap = System.Collections.Generic.Dictionary<string, decimal>;
using TimedData = (System.DateTime timeRecorded, decimal value);
Debe intentar crear un nombre único para el alias, el nombre a la izquierda del signo =
en los ejemplos anteriores. El uso de un nombre que ya se asigna a un tipo (por ejemplo, Object
) o a un espacio de nombres (System
) puede provocar CS0576 o CS1537.
Restricciones de los alias using
Antes de C# 12, el lenguaje imponía estas restricciones en las using
directivas que crean un alias para una declaración de tipo:
No se puede crear un alias con una directiva
using static
:using static con = System.Console; using static unsafe ip = int*;
A partir de C# 12, se presentan estas restricciones:
No se pueden usar los modificadores
in
,ref
oout
en un alias using:// All these are invalid using RefInt = ref int; using OutInt = out int; using InInt = in int;
Una directiva
unsafe using
debe especificar un alias o unstatic 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
No se puede crear un alias en un tipo de referencia nula:
using NullableInt = System.Int32?; // Allowed using NullableString = System.String?; // Not allowed