De acordo com a documentação do StyleCop:
SA1200: UsingDirectivesMustBePlacedWithinNamespace
Causa O AC # usando diretiva é colocado fora de um elemento de espaço para nome.
Descrição da regra Uma violação desta regra ocorre quando uma diretiva usando ou diretiva usando alias é colocada fora de um elemento do espaço para nome, a menos que o arquivo não contenha nenhum elemento do espaço para nome.
Por exemplo, o código a seguir resultaria em duas violações dessa regra.
using System;
using Guid = System.Guid;
namespace Microsoft.Sample
{
public class Program
{
}
}
O código a seguir, no entanto, não resultaria em nenhuma violação desta regra:
namespace Microsoft.Sample
{
using System;
using Guid = System.Guid;
public class Program
{
}
}
Esse código será compilado de maneira limpa, sem erros do compilador. No entanto, não está claro qual versão do tipo Guid está sendo alocada. Se a diretiva using for movida para dentro do namespace, como mostrado abaixo, ocorrerá um erro do 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");
}
}
}
O código falha no seguinte erro do compilador, encontrado na linha que contém Guid g = new Guid("hello");
CS0576: O espaço para nome 'Microsoft.Sample' contém uma definição em conflito com o alias 'Guid'
O código cria um alias para o tipo System.Guid chamado Guid e também cria seu próprio tipo chamado Guid com uma interface de construtor correspondente. Posteriormente, o código cria uma instância do tipo Guid. Para criar essa instância, o compilador deve escolher entre as duas definições diferentes do Guid. Quando a diretiva using-alias é colocada fora do elemento do espaço para nome, o compilador escolhe a definição local de Guid definida no espaço para nome local e ignora completamente a diretiva using-alias definida fora do espaço para nome. Infelizmente, isso não é óbvio ao ler o código.
Quando a diretiva using-alias é posicionada no espaço para nome, no entanto, o compilador deve escolher entre dois tipos de Guid diferentes e conflitantes, ambos definidos no mesmo espaço para nome. Ambos os tipos fornecem um construtor correspondente. O compilador não pode tomar uma decisão; portanto, sinaliza o erro do compilador.
Colocar a diretiva using-alias fora do namespace é uma prática ruim, pois pode causar confusão em situações como essa, nas quais não é óbvio qual versão do tipo está realmente sendo usada. Isso pode levar a um bug que pode ser difícil de diagnosticar.
A colocação de diretivas using-alias no elemento namespace elimina isso como uma fonte de bugs.
- Vários namespaces
A colocação de vários elementos do espaço para nome em um único arquivo geralmente é uma má idéia, mas se e quando isso for feito, é uma boa idéia colocar todas as diretivas usando dentro de cada um dos elementos do espaço para nome, em vez de globalmente na parte superior do arquivo. Isso fará o escopo rigoroso dos espaços de nomes e também ajudará a evitar o tipo de comportamento descrito acima.
É importante observar que, quando o código foi escrito com o uso de diretivas colocadas fora do espaço para nome, deve-se tomar cuidado ao mover essas diretivas para dentro do espaço para nome, para garantir que isso não altere a semântica do código. Como explicado acima, a colocação de diretivas using-alias no elemento namespace permite que o compilador escolha entre tipos conflitantes de maneiras que não acontecerão quando as diretivas forem colocadas fora do namespace.
Como corrigir violações Para corrigir uma violação desta regra, mova todas as diretivas usando e alias usando o elemento de espaço para nome.