解決與 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
{
}
對於 using
或 global using
指示詞中的重複 using
指示詞,編譯器會產生警告 CS8933、CS0105 或診斷 CS8019。 您可以移除任何重複項。
本文稍後會討論將 using
指示詞與 using
指示詞上的 static
、global
或 unsafe
修飾詞錯誤地組合在一起的例子。
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
中。 這麼做會分別導致 CS8915 和 CS8914。
此外,static global using
指示詞不能參考 file-local 類型。
別名辨識符號
別名辨識符號 (::
) 要在命名空間別名之前,或在 global
別名之後。 如果您在完整的名稱中使用 ::
代替應使用 .
來分隔元素的話,編譯器會發出 CS0431、CS0432、CS0687、*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 開始,會引進這些限制:
您不能在 using 別名中使用
in
、ref
或out
修飾詞:// 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
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應