共用方式為


解決陣列和集合宣告和初始化運算式中的錯誤和警告

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

  • CS0022: [] 內的索引數目錯誤; 必須是 'number'
  • CS0178陣序規範無效:必須是 ',' 或 ']'
  • CS0248: 無法以負值大小建立陣列
  • CS0270變數宣告中不能指定陣列大小 (請嘗試用 'new' 運算式初始化)
  • CS0611陣列項目不可為型別
  • CS0623陣列初始設定式只可用於變數或欄位初始設定式中。請嘗試改用新的運算式。
  • CS0650陣列宣告子無效:若要宣告 Managed 陣列,陣序規範必須位於變數識別項之前。若要宣告固定大小緩衝區欄位,請在欄位類型之前使用 fixed 關鍵字。
  • CS0719陣列項目不得為靜態型別
  • CS0747初始設定式成員宣告子無效。
  • CS0820無法指派陣列初始設定式給隱含型別區域變數
  • CS0826找不到隱含型別陣列的最佳類型。
  • CS0846必須是巢狀的陣列初始設定式
  • CS1063集合初始設定式的最佳多載 Add 方法已淘汰。
  • CS1552陣列型別規範 [] 必須出現在參數名稱之前
  • CS1586建立陣列必須有陣列大小或陣列初始設定式
  • CS1920項目初始設定式不可為空白。
  • CS1921最符合的多載方法,沒有正確的初始設定式項目簽章。可初始化的 Add 必須是可存取的執行個體方法。
  • CS1925無法使用集合初始設定式來初始化型別 'type' 的物件。
  • CS1950集合初始設定式的最佳多載 Add 方法 'name' 有一些無效的引數。
  • CS1954無法使用集合初始設定式項目之最符合的多載方法。集合初始設定式 'Add' 方法不能具有 refout 參數。
  • CS9174無法使用集合常值初始化型別,因為無法建構型別。
  • CS9176集合常值沒有目標型別。
  • CS9185CollectionBuilderAttribute 產生器類型必須是非泛型類別或結構。
  • CS9186CollectionBuilderAttribute 方法名稱無效。
  • CS9187找不到具有預期簽章的可存取方法:具有型別單一參數的靜態方法 ReadOnlySpan<T>;以及正確的傳回型別
  • CS9188型別具有 CollectionBuilderAttribute,但沒有項目類型。
  • CS9203無法在此內容中使用此型別的集合運算式,因為它可能會公開在目前範圍之外。
  • CS9210這個版本的 System.Collections.Immutable.ImmutableArray<T> 無法搭配集合運算式使用。
  • CS9212分散運算子 '..' 無法對 'type' 類型的變數進行操作,因為 'type' 不包含 'member' 的公用實例或延伸定義。
  • CS9213集合運算式目標 'type' 沒有元素類型。
  • CS9214集合運算式類型必須具有適用的建構函式,且可以在沒有引數的情況下呼叫。
  • CS9215集合運算式類型 'type' 必須具有可以使用單一引數呼叫的實例或擴充方法 'Add'。
  • CS9222集合初始化運算式會產生集合 'type' 的無限實例化鏈結。
  • CS9332無法在 catch 子句的篩選運算式中使用 '..' 分散運算子。
  • CS9354:「 with(...)」元素必須是第一個元素
  • CS9355:不支援型別 'type' 的 ' with(...)' 元素
  • CS9356:「 with(...)」元素參數不能是動態的
  • CS9357唯讀介面的「with(...)」元素如果存在,則必須為空
  • CS9358本集合的元素類型可能不是ref結構體,也不是允許ref結構式的型別參數
  • CS9359方法「method」沒有超載,且參數為「number」

此外,本文也涵蓋下列警告:

  • CS1062集合初始設定式的最佳多載 Add 方法已淘汰。
  • CS1064集合初始設定式的最佳多載 Add 方法已淘汰。
  • CS3007只有未命名陣列型別有差異的多載方法 'method' 不符合 CLS 標準
  • CS3016以陣列做為屬性引數不符合 CLS 標準
  • CS0251正在以負值索引檢索陣列 (陣列索引一律從 0 開始)
  • CS9208集合運算式可能會產生非預期的堆積配置。請考慮明確建立陣列,然後轉換成最終型別,讓配置明確。
  • CS9209由於使用 '..' 分布,集合運算式可能會產生非預期的堆積配置。請考慮明確建立陣列,然後轉換成最終型別,讓配置明確。
  • CS9332無法在 catch 子句的篩選運算式中使用 '..' 分散運算子。

無效的陣列元素存取

  • CS0022[] 內的索引數目錯誤; 必須是 'number'
  • CS0251正在以負值索引檢索陣列 (陣列索引一律從 0 開始)

若要正確存取陣列元素,請遵循下列索引規則。 如需詳細資訊,請參閱陣列

  • 指定與宣告維度相同的索引數目 (CS0022) 。 一維陣列需要一個索引;一個三維數組需要三個索引。
  • 僅針對陣列索引使用非負整數 (CS0251)。 陣列索引一律從零開始。

不正確的集合初始設定式

  • CS0747初始設定式成員宣告子無效。
  • CS1920項目初始設定式不可為空白。
  • CS1921最符合的多載方法,沒有正確的初始設定式項目簽章。可初始化的 Add 必須是可存取的執行個體方法。
  • CS1922無法使用集合初始化運算式初始化類型 'type',因為 'type' 未實作 'System.Collections.IEnumerable'。
  • CS1925無法使用集合初始設定式來初始化型別 'type' 的物件。
  • CS1927警告:忽略模組的 /win32manifest,因為它僅適用於元件
  • CS1950集合初始設定式的最佳多載 Add 方法 'name' 有一些無效的引數。
  • CS1954無法使用集合初始設定式項目之最符合的多載方法。集合初始設定式 'Add' 方法不能具有 refout 參數。
  • CS9174無法使用集合常值初始化型別,因為無法建構型別。
  • CS9176集合常值沒有目標型別。
  • CS9203無法在此內容中使用此型別的集合運算式,因為它可能會公開在目前範圍之外。
  • CS9210此版本的System.Collections.Immutable.ImmutableArray<T>無法與集合運算式搭配使用。
  • CS9212分散運算子 '..' 無法對類型為 'type' 的變數進行操作,因為 'type' 不包含 'member' 的公用實例或延伸模組定義。
  • CS9213集合運算式目標 'type' 沒有元素類型。
  • CS9214集合運算式類型必須具有適用的建構函式,且可以在沒有引數的情況下呼叫。
  • CS9215集合運算式類型 'type' 必須具有可以使用單一引數呼叫的實例或擴充方法 'Add'。
  • CS9222集合初始化運算式會產生集合 'type' 的無限實例化鏈結。
  • CS9332無法在 catch 子句的篩選運算式中使用 '..' 分散運算子。
  • CS9354:「 with(...)」元素必須是第一個元素
  • CS9355'with(...)'元素不支援型別'type'
  • CS9356:「 with(...)」元素參數不能是動態的
  • CS9357:如果唯讀介面的'with(...)'元素存在,則必須為空
  • CS9358本集合的元素類型可能不是ref結構體,也不是允許ref結構式的型別參數
  • CS9359方法「method」沒有超載,且參數為「number」

編譯器也可能產生下列警告:

  • CS1062集合初始設定式的最佳多載 Add 方法已淘汰。
  • CS1063集合初始設定式的最佳多載 Add 方法已淘汰。
  • CS1064集合初始設定式的最佳多載 Add 方法已淘汰。
  • CS9208集合運算式可能會產生非預期的堆積配置。請考慮明確建立陣列,然後轉換成最終型別,讓配置明確。
  • CS9209: 由於使用 '..' 分布,集合運算式可能會產生非預期的堆積配置。請考慮明確建立陣列,然後轉換成最終型別,讓配置明確。

若要建立有效的集合初始化運算式,請遵循下列規則。 如需詳細資訊,請參閱 集合運算式

  • 請勿在相同的初始化運算式中混合屬性初始化與元素新增 (CS0747) 。
  • 在集合初始化運算式中包含至少一個元素,並附上大括弧 (CS1920) 。
  • 請確定集合類別類型實作 IEnumerableCS1922)。
  • 僅將集合初始化運算式與集合類型搭配使用 (CS1925) 。
  • 確認 Add 方法是否可存取、採用符合元素類型的一個參數,而且不使用 refout 修飾元 (CS1921CS1954)。
  • 解決模棱兩可的方法 Add 多載 (CS1950)。
  • 當編譯器無法推斷集合運算式時,為集合運算式提供明確的目標類型 (CS9176CS9213)。
  • 請確定集合類型可使用無參數建構函式 (CS9174CS9214) 建構。
  • 請勿在 ref struct 集合運算式中使用可能違反參考安全性的類型 (CS9203)。
  • 更新至集合運算式的 ImmutableArray 相容執行階段版本 (CS9210)。
  • 實作列舉模式 (例如 GetEnumerator) 以取得分散運算子支援 (CS9212) 。
  • 避免集合初始化中的循環相依性 (CS9222)。
  • 請勿在 catch 子句篩選運算式中使用分散運算子 (CS9332)。
  • 在集合表達式(with(...))中將元素置於首位。
  • 要僅將 with(...) 元素用於支援集合表達式參數的類型(CS9355)。
  • 不要在 with(...) Elements 中使用動態參數(CS9356)。
  • 用空 with() 於唯讀介面類型(CS9357)。
  • 不要在不支援 refstruct 的集合中使用 refstruct 類型作為元素類型(CS9358)。
  • 將參數數量 with(...) 與可用的建構子過載(CS9359)相匹配。

不正確的陣列順位

  • CS0178陣序規範無效:必須是 ',' 或 ']'
  • CS0650陣列宣告子無效:若要宣告 Managed 陣列,陣序規範必須位於變數識別項之前。若要宣告固定大小緩衝區欄位,請在欄位類型之前使用 fixed 關鍵字。
  • CS1552陣列型別規範 [] 必須出現在參數名稱之前

若要正確宣告陣列,請遵循正確的語法順序。 如需詳細資訊,請參閱 陣列 和陣列初始設定式的 C# 語言規格 一節。

陣列宣告會依序由下列標記組成:

  1. 陣列元素的類型 (例如 intstringSomeClassType)。
  2. 陣列括弧,可選擇性地包含多個維度的逗號。
  3. 變數名稱。

指定陣列維度時,您可以使用:

  • 大括弧中的數個元素 ({})
  • 空白括弧
  • 以括弧括住的一或多個逗號

下列範例顯示有效的陣列宣告:

int[] anArrayOfIntegers;
string[,,] threeDimensionalStringArray;

不正確的陣列長度

  • CS0248無法以負值大小建立陣列
  • CS0270無法在變數宣告中指定陣列大小 (嘗試使用 'new' 運算式進行初始化)
  • CS1586建立陣列必須有陣列大小或陣列初始設定式

若要建立具有有效長度的陣列,請在初始化期間指定大小,而不是宣告。 如需詳細資訊,請參閱陣列

  • 指定陣列長度作為初始化的一部分,而不是宣告 (CS0270) 。
  • 僅針對陣列維度使用正整數 (CS0248)。
  • 請在大小指定中提供new,或利用陣列初始值設定式 (CS1586)。

下列範例顯示上述兩種機制:

int[] fiveIntegers = new int[5];
string[] weekDays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

不正確的項目類型

  • CS0611陣列項目不可為型別 'type'
  • CS0719陣列項目不得為靜態型別
  • CS0820無法指派陣列初始設定式給隱含型別區域變數
  • CS0826找不到隱含類型陣列的最佳類型

若要使用具有正確元素類型的陣列,請遵循這些類型限制。 如需詳細資訊,請參閱 隱含型別的局部變數最佳通用類型

  • 請勿使用 和 System.TypedReferenceSystem.ArgIterator受限制類型作為陣列元素類型 (CS0611) 。
  • 請勿使用 static 類別作為陣列元素類型,因為無法建立實例 (CS0719)。
  • 使用 new 運算式來初始化隱含類型的陣列(CS0820)。
  • 請確定隱含類型化陣列初始化運算式中的所有元素都有最佳通用類型 (CS0826) 。

下列範例示範如何宣告隱含類型的陣列:

var implicitType = new[] { 1, 2, 3 };
        
char c = 'c';
short s1 = 0;
short s2 = -0;
short s3 = 1;
short s4 = -1;

// common type is "int"
var commonType = new[] { s1, s2, s3, s4, c, 1 };

若要確保最佳通用類型,請使用下列任一技術:

  • 為陣列指定明確類型。
  • 為所有陣列元素指定相同類型。
  • 請對可能導致問題的元素進行明確的類型轉換。

不正確的陣列初始設定式

  • CS0623陣列初始設定式只可用於變數或欄位初始設定式中。請嘗試改用新的運算式。
  • CS0846必須是巢狀的陣列初始設定式
  • CS1925無法使用集合初始設定式來初始化型別 'type' 的物件。

這些錯誤表示陣列初始化運算式語法無效。 如需詳細資訊,請參閱陣列

若要建立有效的陣列初始化運算式:

  • 僅在變數或欄位宣告中使用陣列初始設定式 (CS0623) 。 在其他內容中使用 new 表達式。
  • 確認元素或子陣列({)周圍的大括號(})配對正確。
  • 請確定初始化運算式符合鋸齒狀陣列初始化中的陣列數目。
  • 集合初始設定式僅搭配集合類型使用,而不是陣列或其他類型 (CS1925) 。

不正確的集合建立器

  • CS9175運算式樹狀結構可能不包含集合運算式。
  • CS9177:「 CollectionBuilderAttribute」產生器方法傳回類型必須符合「betterness」中使用的集合類型。
  • CS9178自然類型 'type' 沒有目標類型。
  • CS9179集合運算式類型必須具有適用的建構函式,且可呼叫不含引數。
  • CS9180:「 CollectionBuilderAttribute」產生器方法必須是靜態方法。
  • CS9181:「 CollectionBuilderAttribute」產生器方法參數類型必須符合參數 'ReadOnlySpan<{0}>'
  • CS9182無效的 'CollectionBuilderAttribute'。在建置器類型 '{0}' 上找不到相符的 '{1}' 方法。
  • CS9183:「 CollectionBuilderAttribute」 方法傳回類型必須是可作為「類型」使用的非抽象、非介面類型
  • CS9185靜態類型不能用作類型引數。
  • CS9186CollectionBuilderAttribute 方法名稱無效。
  • CS9187找不到具有預期簽章的可存取 'Create' 方法:具有類型為 'ReadOnlySpan<{0}>' 且傳回類型為 '{1}' 的單一參數的靜態方法。
  • CS9188'scoped' 無法作為集合運算式類型參數的修飾詞。
  • CS9190'CollectionBuilderAttribute' 方法 'builderMethod' 不適用,因為它是泛型。
  • CS9192內嵌陣列轉換無法與集合運算式搭配使用。
  • CS9193引數 'argument' 不得與 'ref' 關鍵字一起傳遞。
  • CS9194引數 'argument' 可能無法與 'out' 關鍵字一起傳遞
  • CS9195引數 'argument' 可能無法與 'in' 關鍵字一起傳遞
  • CS9196功能 '集合運算式' 在 C# 'version' 中無法使用。請使用語言版本 'requiredVersion' 或更高版本。
  • CS9197C# 'version' 中無法使用「內嵌陣列」功能。請使用語言版本 'requiredVersion' 或更高版本。
  • CS9198C# 'version' 中不支援在非同步和迭代器方法中使用 'ref' 和 'unsafe' 功能。請使用語言版本 'requiredVersion' 或更高版本。
  • CS9199功能 '集合運算式' 在 C# 'version' 中無法使用。請使用語言版本 'requiredVersion' 或更高版本。
  • CS9202功能 'ref 唯讀參數' 在 C# 'version' 中不可用。請使用語言版本 'requiredVersion' 或更高版本。
  • CS9208'nameof' 運算子無法用於內嵌陣列存取。
  • CS9209ref 傳回屬性 'property' 無法用作值引數。
  • CS9211運算式必須是 'type' 類型,因為它是以參考方式賦值的
  • CS9212無法使用集合運算式作為固定陳述式中的值
  • CS9217:'ref' 變數無法跨越 'await' 或 'yield' 邊界保留。
  • CS9218:「 paramName」 是 ref 結構,而且不能是參數的類型
  • CS9221類型 'type' 可能不是 ref 結構或允許 ref 結構的類型參數,以便在泛型類型或方法 'member' 中將其用作參數 'parameter'
  • CS9223包含 'ref' 欄位的結構無法用於集合運算式。
  • CS9228不允許 ref 結構的非變數宣告
  • CS9232部分方法宣告有簽章差異。
  • CS9233:「 檔案」修飾詞只能用於編譯單位最上層定義的類型

若要正確建立具有集合建置器屬性的集合運算式,請遵循下列需求。 如需詳細資訊,請參閱 集合運算式

  • 請確定目標類型有支援 foreach 的迭代類型(CS9188)。
  • 請勿使用泛型類型作為集合產生器類型 (CS9185) 。
  • 確認 中 CollectionBuilderAttribute 指定的方法名稱是否有效 (CS9186) 。
  • 僅套用CollectionBuilderAttribute符合必要簽章的靜態方法:傳回集合類型,並採用ReadOnlySpan<T>符合元素類型 (TCS9181CS9182CS9183、CS9187CS9190) 的參數。
  • 請確定傳回類型相符,而且不是抽象或介面 (CS9177CS9183) 。
  • 請勿在集合運算式中使用 ref 結構或類型搭配 ref 欄位 (CS9218CS9221CS9223CS9228)。
  • 避免在運算式樹狀結構中使用集合運算式 (CS9175)。
  • 針對集合運算式和相關功能 (CS9196CS9197CS9198CS9199CS9202) 使用正確的語言版本。

Common Language Specification 警告

  • CS3007只有未命名陣列型別有差異的多載方法 'method' 不符合 CLS 標準
  • CS3016以陣列做為屬性引數不符合 CLS 標準

若要使用陣列撰寫符合 CLS 規範的程式碼,請遵循下列指導方針。 如需詳細資訊,請參閱 語言獨立性

  • 請勿建立僅在於陣列元素類型上有所不同的多載方法(CS3007)。
  • 請勿使用陣列作為屬性引數 (CS3016)。

如果您有使用不規則陣列 (Jagged Array) 的多載方法,而方法簽章的唯一不同只在於陣列的項目類型,便會發生 CS3007。 若要避免此錯誤,請考慮使用矩形陣列,而不是不規則陣列,或者,如果不需要 CLS 合規性,請移除 CLSCompliantAttribute 屬性。 如需 CLS 合規性的詳細資訊,請參閱語言獨立性及與語言無關的元件

CS3016 指示將陣列傳遞至屬性不符合 Common Language Specification (CLS) 標準。 如需 CLS 合規性的詳細資訊,請參閱語言獨立性以及與語言無關的元件