解決與 using 命名空間相關的警告問題

本文涵蓋下列編譯器錯誤:

  • CS0138錯誤:using 命名空間指示詞只能套用到命名空間;'type' 是類型,不是命名空間。
  • CS0431錯誤:不能搭配使用別名 'identifier' 與 ::,因為別名會參考類型。請改用 .
  • CS0432錯誤:找不到別名 'identifier'。
  • CS0576錯誤:命名空間 'namespace' 包含與別名 'identifier' 相衝突的定義。
  • CS0687錯誤:命名空間別名限定詞 :: 一定會解析為類型或命名空間,所以不能用在這裡。請考慮改用 .
  • CS1529錯誤:using 子句必須位於所有其他命名空間中所定義的元素之前 (外部別名宣告除外)。
  • CS1537錯誤:using 別名 'alias' 之前曾出現於此命名空間中。
  • CS7000錯誤:未預期的別名用法。
  • CS7007錯誤:using static 指示詞只能套用至類型。請考慮改用 using namespace 指示詞
  • CS8083錯誤:別名限定的名稱不是運算式。
  • CS8085錯誤:'using static' 指示詞不能用來宣告別名。
  • CS8914錯誤:global using 指示詞不能用在命名空間宣告中。
  • CS8915錯誤:global using 指示詞必須位於所有非 global using 指示詞之前。
  • CS9055錯誤:file-local 類型不能用在 'global using static' 指示詞中。
  • CS9130錯誤:using 別名不能是 ref 類型。
  • CS9131錯誤:只有 using 別名可以是 unsafe
  • CS9132錯誤:using 別名不能是可為 Null 的參考類型。
  • CS9133錯誤:static 修飾詞必須在 unsafe 修飾詞之前。
  • CS9162類型對 'using static' 無效。只能使用 class、struct、interface、enum、delegate 或 namespace。

以及下列編譯器警告:

  • 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
{
}

對於 usingglobal using 指示詞中的重複 using 指示詞,編譯器會產生警告 CS8933CS0105 或診斷 CS8019。 您可以移除任何重複項。

本文稍後會​討論將 using 指示詞與 using 指示詞上的 staticglobalunsafe 修飾詞錯誤地組合在一起的例子。

using static 指示詞

using static 指示詞會將一個類型的成員匯入到目前的命名空間。 下列範例會從 System.Console 中將方法 (例如 WriteLine) 匯入到目前的命名空間:

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 中。 這麼做會分別導致 CS8915CS8914

此外,static global using 指示詞不能參考 file-local 類型。

別名辨識符號

別名辨識符號 (::) 要在命名空間別名之前,或在 global 別名之後。 如果您在完整的名稱中使用 :: 代替應使用 . 來分隔元素的話,編譯器會發出 CS0431CS0432CS0687、*CS7000CS8083 中的其中一個錯誤碼。

在所有情況下,請以 . 分隔符號來取代 ::

此外,如果您定義名為 global 的別名,則編譯器會發出 CS0440global 別名一律會參考全域命名空間。 為其宣告別名不會有作用,您應該為您的別名挑選一個不同的名稱。

別名名稱衝突

您可以使用 using 指示詞,宣告命名空間或類型的別名

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

您應該嘗試為別名建立唯一的名稱,也就是在上面範例中 = 號左邊的名稱。 使用已對應到類型 (例如 Object) 或命名空間 (System) 的名稱可能會導致 CS0576CS1537

using 別名的限制

在 C# 12 之前,該語言對為類型宣告建立別名的 using 指示詞施加了以下的限制:

  • 您不能使用 using static 指示詞建立別名:

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

從 C# 12 開始,會引進這些限制:

  • 您不能在 using 別名中使用 inrefout 修飾詞:

    // 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