Según la documentación de StyleCop:
SA1200: UsingDirectivesMustBePlacedWithinNamespace
Causa AC # usando directiva se coloca fuera de un elemento de espacio de nombres.
Descripción de la regla Se produce una violación de esta regla cuando una directiva using o una directiva using-alias se coloca fuera de un elemento de espacio de nombres, a menos que el archivo no contenga ningún elemento de espacio de nombres.
Por ejemplo, el siguiente código daría lugar a dos violaciones de esta regla.
using System;
using Guid = System.Guid;
namespace Microsoft.Sample
{
public class Program
{
}
}
Sin embargo, el siguiente código no daría lugar a ninguna violación de esta regla:
namespace Microsoft.Sample
{
using System;
using Guid = System.Guid;
public class Program
{
}
}
Este código se compilará limpiamente, sin errores de compilación. Sin embargo, no está claro qué versión del tipo Guid se está asignando. Si la directiva using se mueve dentro del espacio de nombres, como se muestra a continuación, se producirá un error del compilador:
namespace Microsoft.Sample
{
using Guid = System.Guid;
public class Guid
{
public Guid(string s)
{
}
}
public class Program
{
public static void Main(string[] args)
{
Guid g = new Guid("hello");
}
}
}
El código falla en el siguiente error del compilador, que se encuentra en la línea que contiene Guid g = new Guid("hello");
CS0576: El espacio de nombres 'Microsoft.Sample' contiene una definición en conflicto con el alias 'Guid'
El código crea un alias para el tipo System.Guid llamado Guid, y también crea su propio tipo llamado Guid con una interfaz de constructor coincidente. Más tarde, el código crea una instancia del tipo Guid. Para crear esta instancia, el compilador debe elegir entre las dos definiciones diferentes de Guid. Cuando la directiva using-alias se coloca fuera del elemento de espacio de nombres, el compilador elegirá la definición local de Guid definida dentro del espacio de nombres local, e ignorará por completo la directiva using-alias definida fuera del espacio de nombres. Esto, desafortunadamente, no es obvio al leer el código.
Sin embargo, cuando la directiva using-alias se coloca dentro del espacio de nombres, el compilador debe elegir entre dos tipos Guid diferentes y conflictivos, ambos definidos dentro del mismo espacio de nombres. Ambos tipos proporcionan un constructor coincidente. El compilador no puede tomar una decisión, por lo que marca el error del compilador.
Colocar la directiva using-alias fuera del espacio de nombres es una mala práctica porque puede generar confusión en situaciones como esta, donde no es obvio qué versión del tipo se está utilizando realmente. Potencialmente, esto puede conducir a un error que puede ser difícil de diagnosticar.
Colocar directivas con alias dentro del elemento de espacio de nombres elimina esto como fuente de errores.
- Múltiples espacios de nombres
Colocar múltiples elementos de espacio de nombres dentro de un solo archivo generalmente es una mala idea, pero si esto se hace, es una buena idea colocar todos los directorios que usan dentro de cada uno de los elementos de espacio de nombres, en lugar de globalmente en la parte superior del archivo. Esto abarcará estrechamente los espacios de nombres y también ayudará a evitar el tipo de comportamiento descrito anteriormente.
Es importante tener en cuenta que cuando el código se ha escrito utilizando directivas colocadas fuera del espacio de nombres, se debe tener cuidado al mover estas directivas dentro del espacio de nombres, para asegurarse de que esto no cambie la semántica del código. Como se explicó anteriormente, la colocación de directivas using-alias dentro del elemento de espacio de nombres permite al compilador elegir entre tipos en conflicto de formas que no sucederán cuando las directivas se coloquen fuera del espacio de nombres.
Cómo corregir infracciones Para corregir una infracción de esta regla, mueva todas las directivas y directivas con alias dentro del elemento de espacio de nombres.