配列とコレクションの宣言と初期化式のエラーと警告を解決する

この記事では、次のコンパイラ エラーについて説明します。

  • CS0022: "角かっこ [] 内のインデックス数が正しくありません。正しい数は 'number' です"
  • CS0178: "無効な次元指定子です: ',' または ']' を指定してください"
  • CS0248: "負のサイズで配列を作成することはできません"
  • CS0270: "配列のサイズは変数宣言の中で指定できません ('new' を使用して初期化してください)"
  • CS0611: "配列要素を型にすることはできません"
  • CS0623: "配列初期化子は変数かフィールド初期化子の中でのみ使用できます。代わりに、new 式を使用してください。
  • CS0650: "不適切な配列の宣言子: マネージド配列を宣言するには、次元指定子を変数の識別子の前に指定します。固定サイズのバッファー フィールドを宣言するには、フィールド型の前に fixed キーワードを使用します。
  • CS0719: "配列要素をスタティック型にすることはできません"
  • CS0747: "初期化子のメンバー宣言子が無効です。"
  • CS0820: "配列初期化子を暗黙的に型指定されたローカル変数に割り当てることはできません"
  • CS0826: "暗黙的に型指定された配列の最適な型が見つかりませんでした。"
  • CS0846: "入れ子になった配列初期化子が必要です"
  • CS1552: "配列型の指定子の角かっこ [] は、パラメーター名の前に使用してください"
  • CS1586: "配列を作成するには、配列のサイズまたは配列初期化子を指定する必要があります"
  • CS1920: "要素の初期化子を空白にはできません。"
  • CS1921: "最適なオーバーロード メソッド一致に、初期化子要素の正しくないシグネチャが含まれています。初期化可能な Add は、アクセス可能なインスタンス メソッドである必要があります。
  • CS1925: "型 'type' のオブジェクトはコレクション初期化子で初期化することはできません。"
  • CS1954: "コレクション初期化子要素に最適なオーバーロード メソッド一致を使用できません。コレクション初期化子 'Add' メソッドに、refout パラメーターは指定できません。
  • CS9174: "型は構築可能ではないため、コレクション リテラルを使用して型を初期化できません。"
  • CS9176: "コレクション リテラルのターゲット型がありません。"
  • CS9185: "CollectionBuilderAttribute ビルダーの型は、非ジェネリック クラスまたは構造体である必要があります。"
  • CS9186: "CollectionBuilderAttribute メソッド名が無効です。"
  • CS9187: "予期されたシグネチャ (型 ReadOnlySpan<T> の単一パラメーターを持つ静的メソッドで、正しい戻り値の型) を持つアクセス可能なメソッドが見つかりませんでした"
  • CS9188: "型には CollectionBuilderAttribute がありますが、要素型はありません。"
  • CS9203: "この種類のコレクション式は、現在のスコープ外に公開される可能性があるため、このコンテキストでは使用できません。"
  • CS9210: "このバージョンの System.Collections.Immutable.ImmutableArray<T> はコレクション式では使用できません。"

さらに、この記事では次の警告について説明します。

  • CS3007: "名前のない配列型のみが異なるオーバーロードされたメソッド 'method' は、CLS に準拠していません"
  • CS3016: "属性の引数としての配列は CLS 準拠ではありません"
  • CS0251: "負のインデックスで配列します。配列は常にゼロからの開始を示します"
  • CS9208: "コレクション式により、予期しないヒープ割り当てが発生する可能性があります。配列を明示的に作成してから、最終的な型に変換して割り当てを明示的に行うことを検討してください。"
  • CS9209: "コレクション式では、'..' スプレッドの使用により、予期しないヒープ割り当てが発生する可能性があります。配列を明示的に作成してから、最終的な型に変換して割り当てを明示的に行うことを検討してください。"

配列、コレクション初期化子、コレクション式の詳細については、次の記事を参照してください。

無効なコレクション初期化子

以下のエラーはすべて、コレクション初期化子のコンパイラによって生成されたコードが無効であることを示しています。

  • CS0747: "初期化子のメンバー宣言子が無効です。"
  • CS1920: "要素の初期化子を空白にはできません。"
  • CS1921: "最適なオーバーロード メソッド一致に、初期化子要素の正しくないシグネチャが含まれています。初期化可能な Add は、アクセス可能なインスタンス メソッドである必要があります。
  • CS1954: "コレクション初期化子要素に最適なオーバーロード メソッド一致を使用できません。コレクション初期化子 'Add' メソッドに、refout パラメーターは指定できません。
  • CS9174: "型は構築可能ではないため、コレクション リテラルを使用して型を初期化できません。"
  • CS9176: "コレクション リテラルのターゲット型がありません。"
  • CS9203: "この種類のコレクション式は、現在のスコープ外に公開される可能性があるため、このコンテキストでは使用できません。"
  • CS9210: "このバージョンの System.Collections.Immutable.ImmutableArray<T> はコレクション式では使用できません。"

コンパイラでは、次の警告が生成される場合もあります。

  • CS9208: "コレクション式により、予期しないヒープ割り当てが発生する可能性があります。配列を明示的に作成してから、最終的な型に変換して割り当てを明示的に行うことを検討してください。"
  • CS9209: "コレクション式では、'..' スプレッドの使用により、予期しないヒープ割り当てが発生する可能性があります。配列を明示的に作成してから、最終的な型に変換して割り当てを明示的に行うことを検討してください。"

これらのエラーはすべて、コレクション初期化子のコンパイラによって生成されたコードが無効であることを示しています。 以下を確認してください:

  • コレクション初期化子に一連の要素が含まれていること。 コレクション インスタンスのプロパティの設定と、同じ初期化子への要素の追加を同時に行うことはできません。
  • 中かっこ ({}) を含むコレクション初期化子を空にすることはできません。
  • 準拠している Add メソッドにアクセスでき、コレクション要素と同じ型のパラメーターを 1 つ受け取ること。 パラメーターに ref または out 修飾子を含めることはできません。
  • オーバーロードの解決が、より適切な一致として 1 つの Add メソッドを選択すること。 同等に適切な複数の一致メソッドはありません。
  • コレクション式が、コレクション型の明示的に型指定された変数を初期化できること。 変数がコレクションまたは配列型でない場合、または (var を使用して) 暗黙的に型指定されている場合、コレクション初期化子は使用できません。
  • System.Span<T> のような ref struct 型は、参照安全性に違反する可能性のあるコレクション式で初期化できません。
  • コレクション式は、現在のバージョンを使って System.Collections.Immutable.ImmutableArray<T> を正しく初期化できません。 別のバージョンのランタイムを使うか、初期化式を変更してください。

この警告は、スプレッド要素を含むコレクション式によってメモリが割り当てられる可能性があることを示しています。 別のストレージを作成して変換すると、より効率的になる場合があります。

無効な配列初期化子

  • CS0623: "配列初期化子は変数かフィールド初期化子の中でのみ使用できます。代わりに、new 式を使用してください。
  • CS0846: "入れ子になった配列初期化子が必要です"
  • CS1925: "型 'type' のオブジェクトはコレクション初期化子で初期化することはできません。"

これらのエラーは、無効な初期化子が作成されたことを示しています。 考えられる原因は、1 つ以上の要素または子配列の周囲で {} が中かっこが一致していません。 初期化式がジャグ配列の初期化での配列数と一致し、中かっこが一致していることを確実にします。

無効な配列要素アクセス

  • CS0022: "角かっこ [] 内のインデックス数が正しくありません。正しい数は 'number' です"
  • CS0251: "負のインデックスで配列します。配列は常にゼロからの開始を示します"

配列の要素にアクセスするには、配列で宣言されている各軸のインデックスを指定します。 インデックスは、配列名の後の [] の間にあります。 配列インデックスには、次の 2 つのルールがあります。

  1. 配列の宣言で使用されるインデックスの数と同じ数を指定する必要があります。 配列が 1 次元の場合は、インデックスを 1 つ指定する必要があります。 配列が 3 次元の場合は、インデックスを 3 つ指定する必要があります。
  2. インデックスはすべて、負数でない整数値で指定してください。

無効な配列ランク

  • CS0178: "無効な次元指定子です: ',' または ']' を指定してください"
  • CS0650: "不適切な配列の宣言子: マネージド配列を宣言するには、次元指定子を変数の識別子の前に指定します。固定サイズのバッファー フィールドを宣言するには、フィールド型の前に fixed キーワードを使用します。
  • CS1552: "配列型の指定子の角かっこ [] は、パラメーター名の前に使用してください"

配列の宣言は、順番どおりに次のトークンで構成されます。

  1. 配列要素の型。 たとえば、「int」、「string」、「SomeClassType」のように指定します。
  2. 配列の角かっこ。必要に応じて、複数の次元を表すコンマを含みます。
  3. 変数名。

配列の初期化で配列の次元を指定する場合は、次のプロパティを指定できます。

  • 中かっこ ({}) 内の要素の数
  • 空のブラケット
  • 角かっこで囲まれた 1 つ以上のコンマ

たとえば、有効な配列の宣言は次のようになります。

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.TypedReferenceSystem.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 はコレクションの要素の型と一致します。

共通言語仕様の警告

  • CS3007: "名前のない配列型のみが異なるオーバーロードされたメソッド 'method' は、CLS に準拠していません"
  • CS3016: "属性の引数としての配列は CLS 準拠ではありません"

CS3007 は、ジャグ配列を受け取る、オーバーロードされたメソッドが存在し、配列要素の型以外にメソッド シグネチャの違いがない場合に発生します。 このエラーを回避するには、ジャグ配列ではなく四角形配列を使用することを検討するか、CLS 準拠が必要ない場合は、CLSCompliantAttribute 属性を削除してください。 CLS 準拠の詳細については、「言語への非依存性、および言語非依存コンポーネント」をご覧ください。

CS3016 は、属性に配列を渡すことは、共通言語仕様 (CLS) に準拠していないことを示しています。 CLS 準拠の詳細については、「言語への非依存性、および言語非依存コンポーネント」をご覧ください。