解決陣列和集合宣告和初始化運算式中的錯誤和警告
本文涵蓋下列編譯器錯誤:
- 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
' 方法不能具有ref
或out
參數。 - CS9174:無法使用集合常值初始化型別,因為無法建構型別。
- CS9176:集合常值沒有目標型別。
- CS9185:CollectionBuilderAttribute 產生器類型必須是非泛型類別或結構。
- CS9186:CollectionBuilderAttribute 方法名稱無效。
- CS9187:找不到具有預期簽章的可存取方法:具有型別單一參數的靜態方法
ReadOnlySpan<T>
;以及正確的傳回型別 - CS9188:型別具有 CollectionBuilderAttribute,但沒有項目類型。
- CS9203:無法在此內容中使用此型別的集合運算式,因為它可能會公開在目前範圍之外。
- CS9210:這個版本的 System.Collections.Immutable.ImmutableArray<T> 無法搭配集合運算式使用。
此外,本文也涵蓋下列警告:
- CS1062:集合初始設定式的最佳多載 Add 方法已淘汰。
- CS1064:集合初始設定式的最佳多載 Add 方法已淘汰。
- CS3007:只有未命名陣列型別有差異的多載方法 'method' 不符合 CLS 標準
- CS3016:以陣列做為屬性引數不符合 CLS 標準
- CS0251:正在以負值索引檢索陣列 (陣列索引一律從 0 開始)
- CS9208:集合運算式可能會產生非預期的堆積配置。請考慮明確建立陣列,然後轉換成最終型別,讓配置明確。
- CS9209:由於使用 '
..
' 分布,集合運算式可能會產生非預期的堆積配置。請考慮明確建立陣列,然後轉換成最終型別,讓配置明確。
您可以在下列文章中深入了解陣列、集合初始設定式和集合運算式:
不正確的集合初始設定式
以下錯誤指示編譯器為集合初始設定式產生的程式碼不正確:
- CS0747:初始設定式成員宣告子無效。
- CS1063:集合初始設定式的最佳多載 Add 方法已淘汰。
- CS1920:項目初始設定式不可為空白。
- CS1921:最符合的多載方法,沒有正確的初始設定式項目簽章。可初始化的
Add
必須是可存取的執行個體方法。 - CS1950:集合初始設定式的最佳多載 Add 方法 'name' 有一些無效的引數。
- CS1954:無法使用集合初始設定式項目之最符合的多載方法。集合初始設定式 '
Add
' 方法不能具有ref
或out
參數。 - CS9174:無法使用集合常值初始化型別,因為無法建構型別。
- CS9176:集合常值沒有目標型別。
- CS9203:無法在此內容中使用此型別的集合運算式,因為它可能會公開在目前範圍之外。
- CS9210:這個版本的 System.Collections.Immutable.ImmutableArray<T> 無法搭配集合運算式使用。
編譯器也可能產生下列警告:
- CS1062:集合初始設定式的最佳多載 Add 方法已淘汰。
- CS1064:集合初始設定式的最佳多載 Add 方法已淘汰。
- CS9208:集合運算式可能會產生非預期的堆積配置。請考慮明確建立陣列,然後轉換成最終型別,讓配置明確。
- CS9209: 由於使用 '
..
' 分布,集合運算式可能會產生非預期的堆積配置。請考慮明確建立陣列,然後轉換成最終型別,讓配置明確。
這些錯誤皆指示編譯器為集合初始設定式產生的程式碼不正確。 請檢查下列項目:
- 集合初始設定式包含一連串的元素。 您無法在集合執行個體上設定屬性與在相同初始設定式中新增元素的操作混合使用。
- 包含大括弧 (
{
和}
) 的集合初始設定式不可為空白。 - 該類別必須實作 IEnumerable 且具有公用
Add
方法。 - 符合條件的
Add
方法必須可供存取,並採用與集合元素型別相同的一個參數。 參數不能包含ref
或out
修飾元。 - 多載解析必須挑選一個
Add
方法作為更佳的比對。 不能有多個同樣良好的比對方法。 - 集合運算式可以初始化集合類型的明確型別變數。 如果變數不是集合或陣列型別,或者屬於隱含型別 (使用
var
),則無法使用集合初始設定式。 - 不能使用可能違反 ref 安全性的集合運算式初始化型別
ref struct
(例如 System.Span<T>)。 - 集合運算式無法使用目前的版本正確初始化 System.Collections.Immutable.ImmutableArray<T>。 使用不同版本的執行階段,或變更初始化運算式。
警告指示集合運算式 (包括任何 Spread 元素) 可能會配置記憶體。 建立不同的儲存體並進行轉換可能更有效率。
不正確的陣列初始設定式
- CS0623:陣列初始設定式只可用於變數或欄位初始設定式中。請嘗試改用新的運算式。
- CS0846:必須是巢狀的陣列初始設定式
- CS1925:無法使用集合初始設定式來初始化型別 'type' 的物件。
這些錯誤指示您已建立不正確的初始設定式。 可能的原因是一或多個元素或子陣列周圍有不平衡的大括弧 {
和 }
。 確保初始化運算式與不規則陣列初始化中的陣列數相符,且大括弧是平衡的。
無效的陣列元素存取
- CS0022:[] 內的索引數目錯誤; 必須是 'number'
- CS0251:正在以負值索引檢索陣列 (陣列索引一律從 0 開始)
透過指定陣列中宣告的每個軸的索引來存取陣列的元素。 索引在陣列名稱之後的 [
和 ]
之間。 陣列索引有兩個規則:
- 您必須指定與陣列宣告中使用的索引數目相同的數目。 如果陣列有一個維度,您必須指定一個索引。 如果陣列有三個維度,您必須指定三個索引。
- 所有索引必須是非負值整數。
不正確的陣列順位
- CS0178:陣序規範無效:必須是 '
,
' 或 ']
' - CS0650:陣列宣告子無效:若要宣告 Managed 陣列,陣序規範必須位於變數識別項之前。若要宣告固定大小緩衝區欄位,請在欄位類型之前使用 fixed 關鍵字。
- CS1552:陣列型別規範
[]
必須出現在參數名稱之前
陣列宣告是由下列權杖組成,依序如下:
- 陣列元素的類型。 例如
int
、string
或SomeClassType
。 - 陣列括弧,可以選擇包括逗號來表示多維度。
- 變數名稱。
當陣列初始化指定陣列維度,您可以指定下列屬性:
- 大括弧中的數個元素 (
{
和}
) - 空白括弧
- 以括弧括住的一或多個逗號
例如,下列為有效陣列宣告:
int[] anArrayOfIntegers;
string[,,] threeDimensionalStringArray;
如需陣列初始設定式的詳細資訊,請參閱 C# 規格 (C# 語言規格) 一節。
不正確的陣列長度
- CS0248:無法以負值大小建立陣列
- CS0270:變數宣告中不能指定陣列大小 (請嘗試用 'new' 運算式初始化)
- CS1586:建立陣列必須有陣列大小或陣列初始設定式
陣列的每個維度長度都必須指定為陣列初始化的一部分,而不是其宣告。 每個維度的長度都必須是正數。 您可以使用 new
運算式配置陣列,或使用陣列初始設定式來指派所有元素以指定長度。 下列範例顯示上述兩種機制:
int[] fiveIntegers = new int[5];
string[] weekDays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
不正確的項目類型
- CS0611:陣列項目不可為型別 'type'
- CS0719:陣列項目不得為靜態型別
- CS0820:無法指派陣列初始設定式給隱含型別區域變數
- CS0826:找不到隱含型別陣列的最佳類型。
有一些類型不能當做欄位的類型來使用。 這些型別包括 System.TypedReference 和 System.ArgIterator。 陣列的型別不能是 static
類別,因為無法建立 static
類別的執行個體。
您可以將陣列宣告為隱含型別區域變數。 陣列必須使用 new
運算式初始化。 此外,陣列初始設定式中的所有元素都必須具有最佳通用型別。 下列範例示範如何宣告隱含型別陣列:
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 };
您可以使用下列任何技術確保最佳常見型別:
- 為陣列指定明確類型。
- 為所有陣列元素指定相同類型。
- 為可能造成問題的元素提供明確轉換。
不正確的集合建立器
下列錯誤指示集合產生器類型中的錯誤:
- CS9185:
CollectionBuilderAttribute
產生器類型必須是非泛型類別或結構。 - CS9186:
CollectionBuilderAttribute
方法名稱無效。 - CS9187:找不到具有預期簽章的可存取方法:具有型別為
ReadOnlySpan<T>
的單一參數靜態方法;以及正確的傳回型別。 - CS9188:型別具有
CollectionBuilderAttribute
,但沒有項目類型。
這些錯誤指示您的集合產生器類型需要修改。 請記住以下規則:
- 集合類型必須具有反覆項目類型。 換句話說,您可以將
foreach
型別當做集合。 - 集合產生器類型不能是泛型型別。
- System.Runtime.CompilerServices.CollectionBuilderAttribute 上指定的方法名稱必須是有效的方法名稱。 例如,它不能是完成項,或是包含無效識別碼字元的其他名稱。
- 集合建立器方法必須是可存取的靜態方法。 它必須傳回集合類型,而且必須採用 的
ReadOnlySpan<T>
參數,其中T
符合集合的項目類型。
Common Language Specification 警告
- CS3007:只有未命名陣列型別有差異的多載方法 'method' 不符合 CLS 標準
- CS3016:以陣列做為屬性引數不符合 CLS 標準
如果您有使用不規則陣列 (Jagged Array) 的多載方法,而方法簽章的唯一不同只在於陣列的項目類型,便會發生 CS3007。 若要避免此錯誤,請考慮使用矩形陣列,而不是不規則陣列,或者,如果不需要 CLS 合規性,請移除 CLSCompliantAttribute 屬性。 如需 CLS 合規性的詳細資訊,請參閱語言獨立性及與語言無關的元件。
CS3016 指示將陣列傳遞至屬性不符合 Common Language Specification (CLS) 標準。 如需 CLS 合規性的詳細資訊,請參閱語言獨立性以及與語言無關的元件。