StyleCopドキュメントによると:
SA1200:UsingDirectivesMustBePlacedWithinNamespace
原因AC#usingディレクティブが名前空間要素の外に配置されています。
規則の説明ファイルに名前空間要素が含まれていない場合を除き、usingディレクティブまたはusing-aliasディレクティブが名前空間要素の外部に配置されると、この規則の違反が発生します。
たとえば、次のコードでは、このルールの2つの違反が発生します。
using System;
using Guid = System.Guid;
namespace Microsoft.Sample
{
public class Program
{
}
}
ただし、次のコードはこのルールの違反にはなりません。
namespace Microsoft.Sample
{
using System;
using Guid = System.Guid;
public class Program
{
}
}
このコードは、コンパイラエラーなしでクリーンにコンパイルされます。ただし、割り当てられているGuidタイプのバージョンは不明です。以下に示すように、usingディレクティブを名前空間の内部に移動すると、コンパイラエラーが発生します。
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");
}
}
}
コードは、次のコンパイラエラーで失敗します。 Guid g = new Guid("hello");
CS0576:名前空間 'Microsoft.Sample'に、エイリアス 'Guid'と競合する定義が含まれています
このコードは、Guidと呼ばれるSystem.Guid型のエイリアスを作成し、対応するコンストラクターインターフェイスを使用して、Guidと呼ばれる独自の型も作成します。その後、コードはタイプGuidのインスタンスを作成します。このインスタンスを作成するには、コンパイラは2つの異なるGuid定義から選択する必要があります。using-aliasディレクティブが名前空間要素の外にある場合、コンパイラーはローカル名前空間内で定義されたGuidのローカル定義を選択し、名前空間外で定義されたusing-aliasディレクティブを完全に無視します。残念ながら、これはコードを読むときには明らかではありません。
ただし、using-aliasディレクティブが名前空間内に配置されている場合、コンパイラーは、同じ名前空間内で定義されている、競合する2つの異なるGuidタイプから選択する必要があります。これらのタイプは両方とも、一致するコンストラクターを提供します。コンパイラは決定を下すことができないため、コンパイラエラーにフラグを立てます。
名前空間の外にusing-aliasディレクティブを配置することは、このような状況で混乱を招く可能性があるため、実際にはどのバージョンの型が使用されているかが明確ではないため、不適切です。これにより、診断が困難なバグが発生する可能性があります。
名前空間要素内にusing-aliasディレクティブを配置すると、バグの原因としてこれを排除できます。
- 複数の名前空間
単一のファイル内に複数の名前空間要素を配置することは一般に悪い考えですが、これを行う場合、すべてのusingディレクティブをファイルの上部ではなく、各名前空間要素内に配置することをお勧めします。これにより、名前空間のスコープが厳しくなり、上記のような動作を回避するのにも役立ちます。
名前空間の外に配置されたディレクティブを使用してコードが記述されている場合、これらのディレクティブを名前空間内で移動するときは、コードのセマンティクスが変更されないように注意する必要があります。上記で説明したように、using-aliasディレクティブを名前空間要素内に配置すると、ディレクティブが名前空間の外部に配置された場合に発生しない方法で、コンパイラーが競合するタイプを選択できます。
違反の修正方法このルールの違反を修正するには、すべてのusingディレクティブとusing-aliasディレクティブを名前空間要素内に移動します。