本文涵蓋下列編譯器錯誤:
- CS0104: 錯誤:「參考」是「識別碼」與「識別碼」之間的歧義指稱。
- CS0116: 錯誤:命名空間不能直接包含欄位、方法或語句等成員。
- CS0138:錯誤:using 命名空間指令只能套用到命名空間;“type” 是類型,不是命名空間。
- CS0430: 錯誤:外部別名「alias」未在 /reference 選項中指定。
-
CS0431:錯誤:不能搭配使用別名 'identifier' 與
::,因為別名會參考類型。請改用.。 - CS0432:錯誤:找不到別名 'identifier'。
- CS0434: 錯誤:NamespaceName2 中的命名空間 NamespaceName1 與 NamespaceName3 中的類型 TypeName1 衝突。
- CS0438: 錯誤:'module_1' 中的類型與 'module_2' 中的命名空間「namespace' 衝突。
- CS0439: 錯誤:外部別名宣告必須置於命名空間中定義的其他元素之前。
- CS0518: 錯誤:未定義或匯入預定義型別「類型」。
- CS0576:錯誤:命名空間 'namespace' 包含與別名 'identifier' 相衝突的定義。
-
CS0687:錯誤:命名空間別名限定詞
::一定會解析為類型或命名空間,所以不能用在這裡。請考慮改用.。 - CS1022: 錯誤:類型或命名空間定義,或文件結束預期。
- CS1529:錯誤:using 子句必須位於命名空間中所定義的所有其他元素之前 (除外部別名宣告外)。
- CS1537:錯誤:'alias' 的 using 別名已經在此命名空間中出現過。
- CS1671: 錯誤:命名空間宣告不能有修飾符或屬性。
- CS1679: 錯誤:'/reference' 的外部別名無效;「識別碼」並非有效的識別碼。
- CS1680: 錯誤:無效引用別名選項 'alias=' -- 缺少檔名。
- CS1681: 錯誤:你無法重新定義全域外部別名。
- CS1730: 錯誤:組合語言與模組屬性必須置於檔案中定義的其他元素之前,除非使用子句與外部別名宣告。
- CS2034: 錯誤:宣告外部別名的 /reference 選項只能有一個檔名。若要指定多個別名或檔名,請使用多個 /reference 選項。
- CS7000:錯誤:未預期的別名用法。
-
CS7007: 錯誤:
using static指令只能套用於型別。改用using namespace指令來考慮。 - CS7015: 錯誤:「外部別名」在此語境下不適用。
- CS7021: 錯誤:無法在腳本程式碼中宣告命名空間。
- CS8083:錯誤:別名限定的名稱不是運算式。
- CS8085:錯誤:'using static' 指示詞不能用來宣告別名。
- CS8914:錯誤:global using 指示詞不能用在命名空間宣告中。
- CS8915:錯誤:全域 using 指令必須放在所有非全域 using 指令之前。
- CS8954: 錯誤:原始碼檔案只能包含一個檔案範圍命名空間宣告。
- CS8955: 錯誤:原始碼檔案無法同時包含檔案範圍與一般命名空間宣告。
- CS8956: 錯誤:檔案範圍命名空間必須置於檔案中所有其他成員之前。
-
CS9130:錯誤:使用別名不能是
ref類型。 -
CS9131:錯誤:只有 using 別名類型可以是
unsafe。 - CS9132:錯誤:「using」別名不能是可空參考類型。
-
CS9133:錯誤:
static修飾詞必須在unsafe修飾詞之前。 - CS9162:類型對 'using static' 無效。只能使用 class、struct、interface、enum、delegate 或 namespace。
以及下列編譯器警告:
- CS0105:警告:'namespace' 的 using 指示詞之前在此命名空間出現過。
- CS0435: 警告:'assembly' 中的命名空間「namespace' 與匯入的 'assembly' 類型相衝突。使用「assembly」中定義的命名空間。
- CS0436: 警告:'assembly' 中的類型 'type' 與匯入的 'assembly' 類型 'type2' 相衝突。使用「assembly」中定義的類型。
- CS0437: 警告:'assembly2' 中的類型 'type' 與匯入的命名空間 'assembly1' 相衝突。使用「assembly」中定義的類型。
-
CS0440:警告:最好不要定義名為
global的別名,因為global::一定會去參考全域命名空間,而不會去參考別名。 - CS8019:資訊:不必要的 using 指令。
- CS8020: 資訊:未使用的外部別名。
- CS8933:資訊:using 指令先前顯示為 global using。
這些錯誤與警告表示 using 指示、命名空間宣告,或類型與命名空間間出現命名衝突的問題。 以下章節將說明這些錯誤及其修正方法。
using 指示詞
以下錯誤與 using 指令相關:
- CS0105: 使用指令「命名空間」之前曾在此命名空間中出現過。
- CS0430: 外部別名「alias」未在 /reference 選項中指定。
- CS0439: 外部別名宣告必須置於命名空間中定義的其他元素之前。
- CS1529: using 子句必須置於命名空間中定義的其他元素之前,外部別名宣告除外。
- CS1679:' /reference' 的外部別名無效;「識別碼」並非有效的識別碼。
- CS1680: 無效的參考別名選項:'alias=' -- 缺少檔名。
- CS1681: 你無法重新定義全域外部別名。
- CS1730: 組合語言與模組屬性必須置於檔案中定義的其他元素之前,除非使用子句與外部別名宣告。
- CS2034: 宣告外部別名的 /reference 選項只能有一個檔名。若要指定多個別名或檔名,請使用多個 /reference 選項。
- CS7015:「 外部別名」在此情境下不適用。
- CS8019: 不必要使用指令。
- CS8020: 未使用的外部別名。
- CS8933:此使用指令先前已以全域使用的形式出現。
請參閱 使用指令 與 外部別名 語言參考,了解這些診斷的規則。 潛在的解決方法包括:
- 將所有
using指令移到檔案頂端,或命名空間宣告的最上方。 C# 語言要求using指令置於命名空間中其他元素之前(CS1529)。 - 將所有
extern alias聲明置於任何using指令之前。 該語言要求外部別名必須置於所有其他元素之前,包括using指令(CS0439、 CS7015)。 - 將所有組件和模組層級的屬性移動到
using子句和extern alias宣告之後,但必須在任何類型宣告之前。 屬性必須遵循指令,但必須置於類型之前(CS1730)。 - 確保原始碼中的每個
extern alias宣告在專案的 引用選項中都有定義相對應的別名。 編譯器無法解析未指定的別名(CS0430)。 - 為每個外部別名使用獨立
/reference選項,而不是將多個別名合併在同一個選項中。 編譯器要求每個參考選項都需一個別名(CS2034)。 - 請確保你
/reference選項中的別名是有效的 C# 識別碼。 別名必須遵循識別碼命名規則(CS1679)。 在=符號後面加入檔名,以供別名參考選項使用。 編譯器需要知道別名所指的是哪個組合(CS1680)。 - 不要試圖重新定義
global外部別名。global是一個預先定義的別名,指涉所有未設別名的參照(CS1681)。 - 移除重複
using的指令。 當同一命名空間被匯入多次時,編譯器會警告(CS0105、 CS8019、 CS8933)。 - 移除未使用的
extern alias聲明。 當外部別名被宣告但程式碼中從未被引用時,編譯器會發出診斷訊息(CS8020)。
using static 指令
以下錯誤與 using static 指令相關:
- CS0138: 使用命名空間指令只能套用於命名空間;「類型」是一個類型,不是命名空間。
-
CS7007:
using static指令只能套用於類型。改用using namespace指令來考慮。 -
CS9133:
static修飾符必須置於unsafe修飾詞之前。 - CS9162:類型 不適用於「使用靜態」。只能使用類別、結構體、介面、枚舉、代理或命名空間。
請參閱 使用靜態指令 語言參考文獻,了解這些診斷的規則。 潛在的解決方法包括:
- 直接匯入型別成員時請加上
static修飾符,因為省略static會讓編譯器知道你匯入的是命名空間而非型別(CS0138)。 - 匯入命名空間時請移除修
static飾符,因為using static只能套用於類型,無法套用命名空間(CS7007)。 確保指令的目標using static是類別、結構體、介面、列舉或代理,因為其他類型不適合作為靜態匯入的有效目標(CS9162)。 - 合併兩者時,請將
static修飾符放在修飾符之前unsafe,因為語言需要特定的修飾語順序(CS9133)。
全域 using 指令
以下錯誤與 global using 指令相關:
- CS8914: 全域使用指令不能用於命名空間宣告。
- CS8915: 全域使用指令必須置於所有非全域使用指令之前。
請參閱 全域使用指令 語言參考,了解這些診斷的規則。 潛在的解決方法包括:
- 請將
global using指令從任何命名空間宣告移至檔案範圍,因為全域 using 適用於整個專案且無法僅限於特定命名空間(CS8914)。 - 將所有
global using指令置於檔案中非全域using指令之前,因為該語言要求全域指令必須置於本地指令之前(CS8915)。 - 請注意,
static global using指令不能參考 檔案本地 型態。
檔案範圍命名空間
以下錯誤與檔案範圍命名空間有關:
- CS8954: 原始碼檔案只能包含一個檔案範圍命名空間宣告。
- CS8955: 原始碼檔案不能同時包含檔案範圍命名空間與一般命名空間宣告。
- CS8956: 檔案範圍命名空間必須置於檔案中所有其他成員之前。
請參閱 檔案範圍命名空間 語言參考,了解這些診斷的規則。 潛在的解決方法包括:
- 每個檔案只使用一個檔案範圍命名空間宣告,因為該語言只允許單一檔案範圍命名空間來設定檔案中所有型別的命名空間(CS8954)。
- 在同一檔案中選擇檔案範圍或區塊範圍命名空間宣告,因為該語言不允許混合兩種樣式(CS8955)。
- 將檔案範圍命名空間宣告移至任何類型宣告之前,因為命名空間必須在類型宣告前建立(CS8956)。
別名限定詞
以下錯誤與別名限定符有關:
-
CS0431: 不能使用別名「識別碼」,
::因為別名會參考一個型別。.用它代替。 - CS0432: 找不到別名「識別碼」。
-
CS0440: 定義名為
global的別名是不明智的,因為global總是參考全域命名空間,而非別名。 -
CS0687: 命名空間別名的限定詞
::總是會解析成型別或命名空間,因此在此處是非法的。可以考慮改用.。 - CS7000: 意外使用別名。
- CS8083: 具別名限定的名稱不是一種運算式。
請參閱 命名空間別名限定 詞語言參考,了解這些診斷的規則。 潛在的解決方法包括:
- 當你存取類型別名的成員時,請將運算子替換
::成.運算子,因為該::限定符僅適用於命名空間別名,而非類型別名(CS0431, CS0687)。 - 請確保你參考的別名是用
using指令或extern alias宣告的,因為編譯器無法解析未定義的別名(CS0432)。 - 只有在預期有型別或命名空間名稱的情境下才使用別名限定詞,因為別名限定名稱作為表達式不有效(CS7000、 CS8083)。
- 請選擇
global以外的名稱作為別名,因為global是保留用來指向全域命名空間的,且無法重新定義(CS0440)。
使用別名限制
以下錯誤與使用別名的限制有關:
- CS0576: 命名空間「命名空間」包含與別名「識別碼」相衝突的定義。
- CS1537: 使用別名「alias」先前曾在此命名空間中出現。
- CS8085: 不能用「使用靜態」指令來宣告別名。
-
CS9130: 使用別稱不能作為
ref型別。 -
CS9131:只有別名才能使用
unsafe。 - CS9132:使用別名不能作為可空的參考型別。
請參閱 使用別名 語言參考,了解這些診斷的規則。 潛在的解決方法包括:
- 請為別名選擇一個唯一名稱,且不會與作用域內現有的類型或命名空間名稱衝突,因為編譯器無法區分別名與現有定義(CS0576)。
- 每個別名在命名空間內只使用一次,因為重複的別名宣告會造成歧義(CS1537)。
- 宣告別名時請移除
static修飾符,因為別名和靜態匯入是互斥的——用來using static匯入成員或using Alias =建立別名,但不要同時使用兩者(CS8085)。
從 C# 12 開始,使用別名有以下限制:
- 不要在使用別名時使用
ref、in或out修飾符,因為這些參數修飾符在別名類型上下文中並不有效(CS9130)。 - 只在引用指標類型或
unsafe指令的別名時使用using static修飾符,因為unsafe沒有別名或靜態匯入是不允許的(CS9131)。 - 建立參考型別的別名時,請使用非 null 參考型別,因為 nullable 參考型別無法直接建立別名(CS9132)。
命名空間宣告
以下錯誤與命名空間宣告規則相關:
- CS0116: 命名空間不能直接包含欄位、方法或語句等成員。
- CS1022: 需型別或命名空間定義,或檔案結束。
- CS1671: 命名空間宣告不能有修飾符或屬性。
- CS7021: 無法在腳本程式碼中宣告命名空間。
請參閱 命名空間關鍵字 及 C# 程式語言的一般結構 參考,了解這些診斷的規則。 潛在的解決方法包括:
- 確保所有方法、欄位和屬性都必須在型別(類別、結構體、記錄或介面)中宣告,而非直接在命名空間中,因為命名空間只能包含型別宣告、巢狀命名空間和
using指令(CS0116)。 - 檢查你的原始檔案是否有不匹配的大括號,因為在命名空間或型別定義後面多加一個閉尾大括號,當編譯器在檔案末尾遇到意外內容時(CS1022)會產生錯誤。
- 移除命名空間宣告中的任何存取修飾符或屬性,因為命名空間不支援像
public或private這樣的修飾符,且無法套用屬性(CS1671)。 - 將命名空間宣告從 C# 腳本檔案(
.csx)移到一般原始碼檔案(.cs),因為腳本程式碼在單一執行上下文中評估,且不支援命名空間宣告(CS7021)。
命名空間與型別命名衝突
以下錯誤與警告與命名空間與類型間的命名衝突有關:
- CS0104:「 參考」是「識別碼」與「識別碼」之間的模糊指稱。
- CS0434: NamespaceName2 中的命名空間 NamespaceName1 與 NamespaceName3 中的類型 TypeName1 相衝突。
- CS0435: 「assembly」中的命名空間「namespace」與匯入至「assembly」的型別「type」發生衝突。將使用「assembly」中定義的命名空間。
- CS0436: 「assembly」中的類型「type」與匯入的「assembly」類型「type2」衝突。使用「assembly」中定義的類型。
- CS0437:'assembly2' 中的類型 'type' 與匯入的命名空間 'namespace' 在 'assembly1' 中產生衝突。使用 'assembly' 中定義的類型。
- CS0438: module_1 中的類型與 module_2 中的命名空間「命名空間」衝突。
請參閱 使用指令、 外部別名及 命名空間別名限定詞 語言參考,了解這些診斷的規則。 潛在的解決方法包括:
- 當你的程式碼引用存在於多個匯入命名空間的名稱時,請使用完全限定的名稱或 命名空間別名 。
- 當相同名稱出現在兩個或以上由
using指令(CS0104)匯入的命名空間時,編譯器無法判斷你打算使用哪種型別。 - 當匯入的型態與匯入的巢狀命名空間共享相同完全限定名稱時,則重新命名該類型或命名空間。 編譯器無法區分這些名稱(CS0434、 CS0438)。
要解決命名衝突警告,請重新命名其中一個衝突宣告、使用不同的命名空間、移除不必要的集合引用,或使用 外部別名 來區分兩種定義。 編譯器會自動解決這些衝突——使用本地定義的命名空間(匯入型別 CS0435)、本地定義型別(CS0436)或本地定義型別(CS0437)——但警告顯示有潛在混淆來源,你應該處理。
預定義型態匯入
以下錯誤與缺少預先定義型別定義有關:
- CS0518: 預先定義的型別「型別」未被定義或匯入。
備註
此警告僅在明確的 建置 或 重建 操作期間報告。 在 IDE 輸入時,IntelliSense 診斷時不會顯示這個問題。 這表示如果你透過使用欄位或移除該欄位來修正警告,該警告可能會持續存在於錯誤清單中,直到你再次建置或重建專案。
請參閱 NoStandardLib 編譯器選項 語言參考,了解此診斷的規則。
確認你的專案針對的是正確的 .NET 執行環境。 像 System.Int32 和 System.String 這類預先定義的型別來自執行時函式庫。 錯誤或缺少 <TargetFramework> 的規範會阻止編譯器找到這些型別(CS0518)。 請確保 <TargetFramework> 檔案 .csproj 中的屬性指定預期執行時間(例如 net10.0)。 除非你打算自己定義命名空間,否則不要指定 System 編譯器的選項。 此選項可防止匯入定義所有預定義型別的標準函式庫(CS0518)。 如果錯誤依舊存在,試著在 Visual Studio 重新載入專案、刪除 obj and bin 資料夾並重建專案,或重新安裝 .NET 執行環境(CS0518)。