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 directiva using 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 modificador unsafe.
  • 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 que global:: 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, globalo 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 o out 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 un 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
    
  • No se puede crear un alias en un tipo de referencia nula:

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