次の方法で共有


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

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

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

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

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

無効な配列要素アクセス

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

配列要素に正しくアクセスするには、次のインデックス作成規則に従います。 詳細については、「配列」を参照してください。

  • 宣言されたディメンションと同じ数のインデックスを指定します (CS0022)。 1 次元配列には 1 つのインデックスが必要です。3 次元配列には 3 つのインデックスが必要です。
  • 配列インデックスには負以外の整数のみを使用します (CS0251)。 配列インデックスは常に 0 から始まります。

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

  • CS0747: "初期化子のメンバー宣言子が無効です。"
  • CS1920: "要素の初期化子を空白にはできません。"
  • CS1921: "最適なオーバーロード メソッド一致に、初期化子要素の正しくないシグネチャが含まれています。初期化可能な Add は、アクセス可能なインスタンス メソッドである必要があります。
  • CS1922: 'type' は 'System.Collections.IEnumerable' を実装していないため、コレクション初期化子で型 'type' を初期化できません。
  • CS1925: "型 'type' のオブジェクトはコレクション初期化子で初期化することはできません。"
  • CS1927: 警告: アセンブリにのみ適用されるため、モジュールの /win32manifest を無視する
  • CS1950: コレクション初期化子に最も適しているオーバーロード Add メソッドには無効な引数がいくつか含まれています。
  • CS1954: "コレクション初期化子要素に最適なオーバーロード メソッド一致を使用できません。コレクション初期化子 'Add' メソッドに、refout パラメーターは指定できません。
  • CS9174: "型は構築可能ではないため、コレクション リテラルを使用して型を初期化できません。"
  • CS9176: "コレクション リテラルのターゲット型がありません。"
  • CS9203: "この種類のコレクション式は、現在のスコープ外に公開される可能性があるため、このコンテキストでは使用できません。"
  • CS9210: このバージョンの System.Collections.Immutable.ImmutableArray<T> は、コレクション式では使用できません。
  • CS9212: 'type' には 'member' のパブリック インスタンスまたは拡張定義が含まれていないため、Spread 演算子 '..' は型 'type' の変数を操作できません。
  • CS9213: コレクション式ターゲット 'type' に要素型がありません。
  • CS9214: コレクション式の型には、引数なしで呼び出すことができる適用可能なコンストラクターが必要です。
  • CS9215: コレクション式型 'type' には、単一の引数で呼び出すことができるインスタンスまたは拡張メソッド 'Add' が必要です。
  • CS9222: コレクション初期化子により、コレクション 'type' のインスタンス化の無限チェーンが発生します。
  • CS9332: catch 句のフィルター式で '..' スプレッド演算子を使用できません。

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

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

有効なコレクション初期化子を作成するには、次の規則に従います。 詳細については、「 コレクション式」を参照してください。

  • 同じ初期化子 (CS0747) で、プロパティの初期化と要素の追加を混在させる必要はありません。
  • 中かっこ (CS1920) を持つコレクション初期化子に少なくとも 1 つの要素を含めます。
  • コレクション型が IEnumerable (CS1922) を実装していることを確認します。
  • コレクション初期化子は、コレクション型 (CS1925) でのみ使用します。
  • Addメソッドにアクセス可能であり、要素の型に一致する 1 つのパラメーターを受け取り、ref修飾子またはout修飾子 (CS1921CS1954) を使用していないことを確認します。
  • あいまいな Add メソッドのオーバーロード (CS1950) を解決します。
  • コンパイラが推論できない場合は、コレクション式の明示的なターゲット型を指定します (CS9176CS9213)。
  • コレクション型がパラメーターなしのコンストラクター (CS9174CS9214) で構築可能であることを確認します。
  • ref 安全性に違反する可能性があるコレクション式で ref struct 型を使用しないでください (CS9203)。
  • ImmutableArray コレクション式 (CS9210) の互換性のあるランタイム バージョンに更新します。
  • 拡散演算子のサポート (GetEnumerator) の列挙パターン ( など) を実装します。
  • コレクションの初期化で循環依存関係を回避する (CS9222)。
  • キャッチ句フィルター式 (CS9332) ではスプレッド演算子を使用しないでください。

無効な配列ランク

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

配列を正しく宣言するには、適切な構文の順序に従います。 詳細については、配列初期化子 の配列C# 言語仕様 に関するセクションを参照してください。

配列宣言は、次のトークンの順序で構成されます。

  1. 配列要素の型 ( intstringSomeClassTypeなど)。
  2. 配列の角かっこ(複数次元を示すためのコンマを、必要に応じて含む)。
  3. 変数名。

配列の次元を指定する場合は、次の値を使用できます。

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

有効な配列宣言の例を次に示します。

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

これらのエラーは、配列初期化子の構文が無効であることを示しています。 詳細については、「配列」を参照してください。

有効な配列初期化子を作成するには:

  • 配列初期化子は、変数またはフィールド宣言 (CS0623) でのみ使用します。 他のコンテキストで new 式を使用します。
  • 要素または子配列 (CS0846) の周りの中かっこ ({}) のバランスを取ります。
  • 初期化式がジャグ配列初期化の配列の数と一致していることを確認します。
  • コレクション初期化子は、配列やその他の型 (CS1925) ではなく、コレクション型でのみ使用します。

無効なコレクション ビルダー

  • CS9175: 式ツリーにコレクション式が含まれていない場合があります。
  • CS9177: 'CollectionBuilderAttribute' ビルダー メソッドの戻り値の型は、'betterness' で使用されるコレクション型と一致する必要があります。
  • CS9178: 自然型 'type' のターゲット型はありません。
  • CS9179: コレクション式の型には、引数なしで呼び出すことができる適用可能なコンストラクターが必要です。
  • CS9180: 'CollectionBuilderAttribute' ビルダー メソッドは静的メソッドである必要があります。
  • CS9181: 'CollectionBuilderAttribute' ビルダー メソッドのパラメーター型は、パラメーター 'ReadOnlySpan<{0}>' と一致する必要があります
  • CS9182: 'CollectionBuilderAttribute' が無効です。ビルダー型 '{0}' に一致する '{1}' メソッドが見つかりません。
  • CS9183: 'CollectionBuilderAttribute' メソッドの戻り値の型は、'type' として使用できる非抽象インターフェイス型である必要があります
  • CS9185: 静的型を型引数として使用することはできません。
  • CS9186: "CollectionBuilderAttribute メソッド名が無効です。"
  • CS9187: 予期されるシグネチャを持つアクセス可能な 'Create' メソッドが見つかりませんでした。'ReadOnlySpan<{0}>' 型と戻り値の型 '{1}' の単一パラメーターを持つ静的メソッド。
  • CS9188: 'scoped' は、コレクション式の型パラメーターの修飾子として使用できません。
  • CS9190: 'CollectionBuilderAttribute' メソッド 'builderMethod' はジェネリックであるため、適用できません。
  • CS9192: インライン配列変換は、コレクション式では使用できません。
  • CS9193: 引数 'argument' を 'ref' キーワードと共に渡すことができません。
  • CS9194: 引数 'argument' を 'out' キーワードと共に渡すことができません
  • CS9195: 引数 'argument' を 'in' キーワードと共に渡すことができません
  • CS9196: 機能 'コレクション式' は C# 'version' では使用できません。言語バージョン 'requiredVersion' 以上を使用してください。
  • CS9197: 機能 'インライン配列' は C# 'version' では使用できません。言語バージョン 'requiredVersion' 以上を使用してください。
  • CS9198: 機能「非同期メソッドとイテレーターメソッドでの ref および unsafe」は C# バージョン 'version' では利用できません。言語バージョン 'requiredVersion' 以上を使用してください。
  • CS9199: 機能 'コレクション式' は C# 'version' では使用できません。言語バージョン 'requiredVersion' 以上を使用してください。
  • CS9202: 機能 'ref readonly parameters' は C# 'version' では使用できません。言語バージョン 'requiredVersion' 以上を使用してください。
  • CS9208: 'nameof' 演算子はインライン配列アクセスでは使用できません。
  • CS9209: ref を返すプロパティ 'property' を値引数として使用することはできません。
  • CS9211: 式は参照によって割り当てられるため、型 'type' である必要があります
  • CS9212: 固定ステートメントの値としてコレクション式を使用できません
  • CS9217: 'ref' ローカルは、'await' または 'yield' 境界を越えて保持できません。
  • CS9218: 'paramName' は ref 構造体であり、パラメーターの型にすることはできません
  • CS9221: 型 'type' は、ジェネリック型またはメソッド 'member' のパラメーター 'parameter' として使用するために ref 構造体を許可する ref 構造体または型パラメーターではない可能性があります
  • CS9223: 'ref' フィールドを含む構造体は、コレクション式では使用できません。
  • CS9228: ref 構造体の非変数宣言は許可されていません
  • CS9232: 部分メソッド宣言にはシグネチャの違いがあります。
  • CS9233: 'file' 修飾子は、コンパイル単位で最上位レベルで定義されている型でのみ使用できます

コレクション ビルダー属性を使用してコレクション式を正しく作成するには、次の要件に従います。 詳細については、「 コレクション式」を参照してください。

  • ターゲットの型に、 foreach (CS9188) をサポートするイテレーション型があることを確認します。
  • コレクション ビルダー型としてジェネリック型を使用しないでください (CS9185)。
  • CollectionBuilderAttributeで指定されたメソッド名が有効であることを確認します (CS9186)。
  • 必要なシグネチャに一致する静的メソッドでのみCollectionBuilderAttribute適用します。コレクション型を返し、ReadOnlySpan<T>が要素の型 (TCS9183CS9187CS9190) と一致する パラメーターを受け取ります。
  • 戻り値の型が一致し、抽象型またはインターフェイス (CS9177CS9183) ではないことを確認します。
  • ref 構造体または型をコレクション式 (CS9218、CS9221、CS9223CS9228) の ref フィールドで使用しないでください。
  • 式ツリーでコレクション式を使用しないでください (CS9175)。
  • コレクション式と関連する機能 (CS9196、CS9197CS9198CS9199CS9202) には、正しい言語バージョンを使用します。

共通言語仕様の警告

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

配列を使用して CLS 準拠のコードを記述するには、次のガイドラインに従います。 詳細については、「 言語の独立」を参照してください。

  • 配列要素型でのみ異なるオーバーロードされたメソッドを作成しないでください (CS3007)。
  • 配列を属性引数として使用しないでください (CS3016)。

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

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