名前空間の使用に関連する警告を解決する

この記事では、次のコンパイラ エラーについて説明します。

  • CS0138: エラー: using namespace ディレクティブは名前空間に対してのみ使用できます。"type" は名前空間ではなく型です。
  • CS0431: エラー: エイリアスが型を参照しているため、エイリアス "識別子" を :: と使用できません。代わりに . を使用してください
  • CS0432: エラー: エイリアス "identifier" が見つかりません。
  • CS0576: エラー: 名前空間 "namespace" に、エイリアス "identifier" と競合する定義が含まれています。
  • CS0687: エラー: 名前空間エイリアス修飾子 :: は、常に型または名前空間に解決するので、ここでは無効です。代わりに . を使用することを検討してください。
  • CS1529: エラー: using 句は、extern エイリアス宣言以外の、名前空間で定義された他のすべての要素の前に使用しなければなりません。
  • CS1537エラー: using エイリアス "alias" は以前にこの名前空間で使用されています。
  • CS7000: エラー: エイリアス名の予期しない使用方法です。
  • CS7007: エラー: using static ディレクティブは型に対してのみ適用できます。代わりに using namespace ディレクティブを使用することを検討してください
  • CS8083: エラー: エイリアスで修飾された名前が式ではありません。
  • CS8085: エラー: "using static" ディレクティブはエイリアスの宣言には使用できません。
  • CS8914: エラー: グローバル using ディレクティブを名前空間宣言で使用することはできません。
  • CS8915: エラー: グローバル using ディレクティブは、すべての非グローバル using ディレクティブの前に指定する必要があります。
  • CS9055: エラー: ファイル ローカル型は、"global using static" ディレクティブでは使用できません。
  • CS9130: エラー: 使用するエイリアスを ref 型にすることはできません。
  • CS9131: エラー: using エイリアスのみを unsafe にできます。
  • CS9132: エラー: using エイリアスを null 許容参照型にすることはできません。
  • CS9133: エラー: static 修飾子は unsafe 修飾子より前に指定する必要があります。
  • CS9162: 型は "using static" では無効です。使用できるのは、クラス、構造体、インターフェイス、列挙型、デリゲート、または名前空間だけです。

コンパイラ警告は以下のとおりです。

  • CS0105: 警告: "namespace" の using ディレクティブは、この名前空間で既に使用されています。
  • CS0440: 警告: global:: はエイリアスではなく常にグローバル名前空間を参照するため、global という名前のエイリアスを定義することはお勧めしません。
  • CS8019: 情報: 不要な using ディレクティブ。
  • CS8933: 情報: この using ディレクティブは、以前に global using として使用されています。

これらのエラーと警告は、using ディレクティブが正しく形成されていないことを示しています。 次のセクションでは、これらのエラーについて言及し、その修正方法について説明します。

using ディレクティブ

using ディレクティブは、namespace 宣言内の他のどの要素よりも前に、またはファイル内のどの namespace 宣言よりも前に記述する必要があります。 ファイル内で using ディレクティブを後に記述すると、コンパイラによってエラー CS1529 が生成されます。

namespace UsingDirective;
public class MyClass
{
}

using System.Text.Json; // CS1529

この問題を解決するには、using 宣言をファイルの先頭に、または名前空間の先頭に移動します。

using System.Text.Json;
namespace UsingDirective;
public class MyClass
{
}

コンパイラでは、using または global using ディレクティブで重複している using ディレクティブに対して、警告 CS8933CS0105、または診断 CS8019 が生成されます。 重複しているものは削除できます。

using ディレクティブと、using ディレクティブ上の staticglobal、または unsafe 修飾子を誤って組み合わせた場合については、この記事で後ほど説明します。

using static ディレクティブ

using static ディレクティブでは、1 つの型のメンバーを現在の名前空間にインポートします。 次の例では、WriteLine などのメソッドを、System.Consoleから現在の名前空間にインポートします。

using static System.Console;

static 修飾子を省略すると、コンパイラによって CS0138 が生成されます。

using System.Console; // CS0138

型ではなく名前空間をインポートする static 修飾子を含めると、コンパイラによって CS7007 が生成されます。

using static System; // CS7007

シンボルが適切な型でない場合、コンパイラによって CS9162 が出力されます。

using ディレクティブ内で static 修飾子と unsafe 修飾子を組み合わせる場合は、static 修飾子を最初に指定する必要があります。

using static unsafe UnsafeExamples.UnsafeType;

グローバルな using ディレクティブ

global using ディレクティブでは、現在のプロジェクト内のすべてのソース ファイルに名前空間または型をインポートします。

global using System.Text;

global using ディレクティブはいずれも、そのソース ファイル内では非グローバルな using ディレクティブより前に記述する必要があり、namespace 内に配置することはできません。 それを行ってしまうと、それぞれ CS8915 および CS8914 が生成されます。

さらに、static global using ディレクティブでは、ファイルローカル型を参照できません。

エイリアスの修飾子

エイリアスの修飾子である :: の配置場所は、名前空間エイリアスの前、または global エイリアスの後とします。 ::where. を使用して完全修飾名の要素を区切る必要がある場合、コンパイラからは CS0431CS0432CS0687、*CS7000、または CS8083 のいずれかが出力されます。

いずれの場合も、:: を区切り記号 . に置き換えます。

さらに、global という名前のエイリアスを定義すると、コンパイラによって CS0440 が発行されます。 global エイリアスによって参照されるのは、常に、グローバル名前空間です。 それに対してエイリアスを宣言しても機能しません。エイリアスには別の名前を選択する必要があります。

エイリアス名の競合

using ディレクティブを使用すれば、名前空間にも型にもエイリアスを宣言できます。

using JSON = System.Text.Json;
using ValueMap = System.Collections.Generic.Dictionary<string, decimal>;
using TimedData = (System.DateTime timeRecorded, decimal value);

エイリアスには一意の名前 (前の例の = 記号の左側にある名前) を作成するようにしてください。 既に型にマップされている名前 (例: Object) または名前空間 (System) を使用すると、CS0576 または CS1537 が生成される可能性があります。

using エイリアスの制限事項

C# 12 より前の言語では、型宣言でエイリアスを作成する using ディレクティブに次の制限が課されていました。

  • using static ディレクティブを使用してエイリアスを作成することはできません。

    using static con = System.Console;
    using static unsafe ip = int*;
    

C# 12 以降では、次の制限が導入されています。

  • inrefout 修飾子はいずれも、using エイリアス内に使用することができません。

    // All these are invalid
    using RefInt = ref int;
    using OutInt = out int;
    using InInt = in int;
    
  • unsafe using ディレクティブを使用する場合は、エイリアスまたは 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
    
  • null 許容参照型の別名を作成することはできません。

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