コンストラクター宣言とモジュール初期化子のエラーと警告を解決する

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

  • CS0132: 'constructor': 静的コンストラクターはパラメーターなしの必要があります。
  • CS0514: 静的コンストラクターは、明示的な 'this' または 'base' コンストラクターの呼び出しを持つことはできません。
  • CS0515: アクセス修飾子は静的コンストラクターでは許可されません。
  • CS0516: コンストラクター 'constructor' はそれ自体を呼び出すことはできません。
  • CS0517: 'class' には基底クラスがなく、基底コンストラクターを呼び出すことはできません。
  • CS0522: 構造体は基底クラスのコンストラクターを呼び出すことができません。
  • CS0526: インターフェイスにインスタンス コンストラクターを含めることはできません。
  • CS0568: 構造体に明示的なパラメーターなしのコンストラクターを含めることはできません。
  • CS0573: 'field declaration': 構造体にインスタンス フィールド初期化子を含めることはできません。
  • CS0710: 静的クラスにインスタンス コンストラクターを含めることはできません。
  • CS0768: コンストラクターは、別のコンストラクターを介して自身を呼び出すことはできません。
  • CS1018: キーワード 'this' または 'base' が必要です。
  • CS8054: 列挙型に明示的なパラメーターなしのコンストラクターを含めることはできません。
  • CS8091: extern にすることはできず、コンストラクター初期化子を持つことはできません。
  • CS8358: 'in' または 'ref readonly' パラメーターがあるため、属性コンストラクターを使用できません。
  • CS8813: モジュール初期化子は通常のメンバー メソッドである必要があります
  • CS8814: モジュール初期化子メソッド 'method' にモジュール レベルでアクセスできる必要があります
  • CS8815: モジュール初期化子メソッド 'method' は静的で、非仮想である必要があり、パラメーターを持たなければならず、'void' を返す必要があります
  • CS8816: モジュール初期化子メソッド 'method' はジェネリックではなく、ジェネリック型に含めてはなりません
  • CS8861: 予期しない引数リスト。
  • CS8862: パラメーター リストを持つ型で宣言されたコンストラクターには、'this' コンストラクター初期化子が必要です。
  • CS8867: 基本型 '{0}' にアクセス可能なコピー コンストラクターが見つかりません。
  • CS8868: レコード内のコピー コンストラクターは、ベースのコピー コンストラクターを呼び出す必要があります。レコードがオブジェクトから継承される場合は、パラメーターなしのオブジェクト コンストラクターを呼び出す必要があります。
  • CS8878: コピー コンストラクター '{0}' は、レコードがシールされていないため、パブリックまたは保護されている必要があります。
  • CS8900: モジュール初期化子を 'UnmanagedCallersOnly' に属性付けすることはできません。
  • CS8901: 'method' は 'UnmanagedCallersOnly' に属性付けされており、直接呼び出すことはできません。このメソッドへの関数ポインターを取得します。
  • CS8902: 'method' は 'UnmanagedCallersOnly' に属性付けされており、デリゲート型に変換できません。このメソッドへの関数ポインターを取得します。
  • CS8910: プライマリ コンストラクターは、合成されたコピー コンストラクターと競合します。
  • CS8958: パラメーターなしの構造体コンストラクターは 'public' である必要があります。
  • CS8982: パラメーター リストを持つ 'struct' で宣言されたコンストラクターには、プライマリ コンストラクターまたは明示的に宣言されたコンストラクターを呼び出す 'this' 初期化子が必要です。
  • CS8983: フィールド初期化子を持つ 'struct' には、明示的に宣言されたコンストラクターを含める必要があります。
  • CS9105: このコンテキストでは、プライマリ コンストラクター パラメーターを使用できません。
  • CS9106: 識別子は、このコンテキストの型とパラメーターの間であいまいです。
  • CS9108: 匿名メソッド、ラムダ式、クエリ式、またはローカル関数内で ref のような型を持つパラメーターを使用できません。
  • CS9109: インスタンス メンバー内でプライマリ コンストラクター パラメーター refout、または in を使用することはできません。
  • CS9110: インスタンス メンバー内に ref のような型を持つプライマリ コンストラクター パラメーターを使用できません。
  • CS9111: 構造体のインスタンス メンバー内の匿名メソッド、ラムダ式、クエリ式、およびローカル関数は、プライマリ コンストラクター パラメーターにアクセスできません。
  • CS9112: 構造体内の匿名メソッド、ラムダ式、クエリ式、およびローカル関数は、インスタンス メンバー内でも使用されるプライマリ コンストラクター パラメーターにアクセスできません。
  • CS9114: 読み取り専用型のプライマリ コンストラクター パラメーターを割り当てることはできません (型または変数初期化子の init 専用セッターを除く)。
  • CS9115: 読み取り専用型のプライマリ コンストラクター パラメーターは、書き込み可能な参照では返すことができません。
  • CS9116: 読み取り専用型のプライマリ コンストラクター パラメーターは、ref 値または out 値として使用できません (型または変数初期化子の init 専用セッターを除く)。
  • CS9117: 読み取り専用型のプライマリ コンストラクター パラメーターのメンバーは変更できません (型または変数初期化子の init 専用セッターを除く)。
  • CS9118: 読み取り専用型のプライマリ コンストラクター パラメーターのメンバーは、書き込み可能な参照によって返すことができません。
  • CS9119: 読み取り専用型のプライマリ コンストラクター パラメーターのメンバーは、 ref 値または out 値として使用できません (型または変数初期化子の init 専用セッターを除く)。
  • CS9120: 参照によってプライマリ コンストラクター パラメーターを返すことはできません。
  • CS9121: 型の構造体のプライマリ コンストラクター パラメーターにより、構造体レイアウトにサイクルが発生します。
  • CS9122: 予期しないパラメーター リスト。
  • CS9136: インスタンス メンバー内で型のプライマリ コンストラクター パラメーターを使用できません。

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

  • CS0824: コンストラクター 'name' は、external としてマークされています。
  • CS9107: パラメーターは外側の型の状態にキャプチャされ、その値も基本コンストラクターに渡されます。値は基底クラスによってもキャプチャされる場合があります。
  • CS9113: パラメーターが未読です。
  • CS9124: パラメーター は外側の型の状態にキャプチャされ、その値はフィールド、プロパティ、イベントの初期化にも使用されます。
  • CS9179: プライマリ コンストラクター パラメーターがベースのメンバーによってシャドウされる
  • CS9018: 自動実装プロパティが明示的に割り当てられる前に読み取られ、既定値 'default' による先行する暗黙の割り当てが発生します。
  • CS9019: フィールドが明示的に割り当てられる前に読み取られるため、'default' という値が先行して暗黙的に割り当てられます。
  • CS9020: 'this' オブジェクトは、すべてのフィールドが割り当てられる前に読み取られます。その結果、明示的に割り当てされていないフィールドに対して先行する暗黙的な割り当て 'default' が発生します。
  • CS9021: 自動実装プロパティが明示的に割り当てられる前にコントロールが呼び出し元に返され、先行する暗黙的な割り当て 'default' が発生します。
  • CS9022: フィールドが明示的に割り当てられる前に制御が呼び出し元に返され、先行する暗黙的な割り当て 'default' が発生します。

静的コンストラクター

  • CS0132: 'constructor': 静的コンストラクターはパラメーターなしの必要があります。
  • CS0514: 静的コンストラクターは、明示的な 'this' または 'base' コンストラクターの呼び出しを持つことはできません。
  • CS0515: 静的コンストラクターではアクセス修飾子を使用できません。

静的コンストラクターは、型の静的データを初期化します。 詳細については、「静的コンストラクター」を参照してください。

これらのエラーを修正するには、静的コンストラクター宣言が次の規則に従っていることを確認します。

  • 静的コンストラクターはパラメーターなしの (CS0132) である必要があるため、静的コンストラクター宣言からパラメーターを削除します。 初期化値を渡す必要がある場合は、静的コンストラクターを実行する前に設定した静的フィールドまたはプロパティの使用を検討してください。
  • 静的コンストラクターの実行時にランタイムが制御し、アクセス修飾子が意味を持たないため、静的コンストラクターから publicprotectedprivateinternal などのアクセス修飾子を削除します (CS0515)。
  • 静的コンストラクターは他のコンストラクター (: base()) にチェーンできないため、静的コンストラクターから: this()またはコンストラクター初期化子の呼び出しを削除します。 ランタイムは、基底クラスの静的コンストラクターが存在する場合に自動的に呼び出します。

コンストラクター宣言

  • CS0526: インターフェイスにインスタンス コンストラクターを含めることはできません。
  • CS0710: 静的クラスにインスタンス コンストラクターを含めることはできません。
  • CS8054: 列挙型に明示的なパラメーターなしのコンストラクターを含めることはできません。
  • CS8358: 'in' または 'ref readonly' パラメーターがあるため、属性コンストラクターを使用できません。
  • CS8091: コンストラクターを extern にすることはできず、コンストラクター初期化子を持つことはできません。

コンストラクターは、class型やstruct型など、record class型とrecord struct型でのみ宣言できます。 詳細については、「 インスタンス コンストラクター」を参照してください。

これらのエラーを修正するには、次の推奨事項を試してください。

  • class型またはstruct型 (interfaceenum) でコンストラクターを宣言できないため、コンストラクターを型または型に移動します。 インターフェイスはコントラクトを定義しますが、初期化ロジックは提供しません。列挙型の値はコンパイル時に定義されます。
  • 静的クラスをインスタンス化できないため、インスタンス コンストラクターを持つことができないため、静的クラスからインスタンス コンストラクターを削除します (CS0710)。 初期化ロジックが必要な場合は、代わりに静的コンストラクターを使用します。
  • 属性コンストラクターはinまたはref readonlyパラメーター修飾子 (in) をサポートしていないため、属性コンストラクターの値渡しパラメーターにref readonlyまたはパラメーターを変更します。 ランタイムはリフレクションを使用して属性をインスタンス化します。これは、 in または ref readonly 修飾子をサポートしていません。
  • extern コンストラクターは他のコンストラクターにチェーンできないため、: base() コンストラクターから: this()またはexternコンストラクター初期化子を削除します (CS8091)。 extern コンストラクターの実装は外部から提供されるため、コンストラクターの連結は行えません。

コンストラクター宣言では、次の警告を生成できます。

  • CS0824: コンストラクターは、external としてマークされています。

コンストラクターが externマークされている場合、コンパイラは実装が存在することを確認できません。 この警告を抑制するには、非 extern 実装を指定するか、外部実装が正しくリンクされていることを確認します。

構造体型のコンストラクター

  • CS0568: 構造体に明示的なパラメーターなしのコンストラクターを含めることはできません。
  • CS0573: 'field declaration': 構造体にインスタンス フィールド初期化子を含めることはできません。
  • CS8958: パラメーターなしの構造体コンストラクターは 'public' である必要があります。
  • CS8982: パラメーター リストを持つ 'struct' で宣言されたコンストラクターには、プライマリ コンストラクターまたは明示的に宣言されたコンストラクターを呼び出す 'this' 初期化子が必要です。
  • CS8983: フィールド初期化子を持つ 'struct' には、明示的に宣言されたコンストラクターを含める必要があります。

構造体型には、コンストラクターとフィールド初期化に固有の規則があります。 詳細については、「構造体型」の記事の「 構造体の初期化と既定値 」セクションを 参照 してください。

これらのエラーを修正するには、次の推奨事項を試してください。

  • CS0568 または CS0573 が発生した場合は、C# 10 以降にアップグレードします。これらのエラーは古いバージョンの C# でのみ発生するためです。 最新の C# では、構造体内の明示的なパラメーターなしのコンストラクターとフィールド初期化子を使用できます。
  • パラメーターなしの構造体コンストラクターに public アクセス修飾子を追加します。これは、 default 式と配列の割り当てが構造体インスタンスを適切に初期化できるようにするために、パラメーターなしの構造体コンストラクターをパブリックにする必要があるためです (CS8958)。
  • プライマリ コンストラクターを持つ構造体で明示的に宣言されたコンストラクターに : this(...) 初期化子を追加します。これは、一貫性のある初期化を保証するために、パラメーターなしのコンストラクター以外のすべてのコンストラクターをプライマリ コンストラクターまたは別の明示的に宣言されたコンストラクターにチェーンする必要があるためです (CS8982)。
  • コンパイラでは、フィールド初期化子が確実に呼び出されるように明示的なコンストラクターが必要であるため、構造体がフィールド初期化子を使用するときに明示的なコンストラクターを宣言します (CS8983)。 このコンストラクターは、ボディが空の引数なしコンストラクターにすることができます。

次の警告は、読み取られる前またはコントロールが呼び出し元に戻る前に、フィールドまたはプロパティが明示的に割り当てられていないことを示しています。

  • CS9018: 明示的に割り当てられる前に自動実装プロパティが読み取られ、先行する暗黙的な代入が 'default' になります。
  • CS9019: フィールドが明示的に割り当てられる前に読み取られ、先行する暗黙的な割り当てとして 'default' が割り当てられます。
  • CS9020: 'this' オブジェクトは、すべてのフィールドが割り当てられる前に読み取られます。その結果、明示的に割り当てされていないフィールドに対して先行する暗黙的な割り当て 'default' が発生します。
  • CS9021: 自動実装プロパティが明示的に割り当てられる前にコントロールが呼び出し元に返され、先行する暗黙的な割り当て 'default' が発生します。
  • CS9022: フィールドが明示的に割り当てられる前に制御が呼び出し元に返され、先行する暗黙的な割り当て 'default' が発生します。

これらの警告を無音にするには、すべてのフィールドと自動実装プロパティを読み取る前、またはコンストラクターから制御が戻る前に明示的に割り当てます (CS9018CS9019CS9020CS9021CS9022)。 割り当てられていないメンバーが読み取られると、コンパイラは暗黙的に default を割り当てます。これは意図した動作ではない可能性があります。

basethisのコンストラクター呼び出し

  • CS0516: コンストラクターはそれ自体を呼び出すことができません。
  • CS0517: 'class' には基底クラスがなく、基底コンストラクターを呼び出すことはできません。
  • CS0522: 構造体は基底クラスのコンストラクターを呼び出すことができません。
  • CS0768: コンストラクターは、別のコンストラクターを介して自身を呼び出すことはできません。
  • CS1018: キーワード 'this' または 'base' が必要です。

コンストラクター初期化子を使用すると、1 つのコンストラクターは、 : this() または : base()を使用して別のコンストラクターを呼び出すことができます。 詳細については、「コンストラクターの 使用」を参照してください。

これらのエラーを修正するには、次の推奨事項を試してください。

  • 循環コンストラクター呼び出しチェーンを解消してください。コンストラクターは別のコンストラクター (CS0516CS0768) を介して直接または間接的に自分自身を呼び出すことができないためです。 コンストラクターチェーンが最終的に、同じ型の別のコンストラクターを呼び出さないコンストラクターで終了することを確認します。
  • 構造体型のコンストラクターまたは : base() のコンストラクターからSystem.Object初期化子を削除します。これらの型には呼び出す基底クラスのコンストラクターがないためです (CS0517CS0522)。 構造体型は System.ValueTypeから暗黙的に継承されますが、そのコンストラクターを明示的に呼び出すことはできません。
  • コンストラクター初期化子を完了するか、コンストラクター宣言からコロン (:) を削除します。これは、コロンがコンストラクターのシグネチャに従うとき、コンパイラは this() または base() (CS1018) を受け取るためです。 適切なコンストラクター呼び出しを追加するか、チェーンが意図されていない場合はコロンを完全に削除します。

レコードとコピー コンストラクター

  • CS8867: 基本型にアクセス可能なコピー コンストラクターが見つかりません。
  • CS8868: レコード内のコピー コンストラクターは、ベースのコピー コンストラクターを呼び出す必要があります。レコードがオブジェクトから継承される場合は、パラメーターなしのオブジェクト コンストラクターを呼び出す必要があります。
  • CS8878: レコードがシールされていないため、コピー コンストラクターをパブリックまたは保護する必要があります。
  • CS8910: プライマリ コンストラクターは、合成されたコピー コンストラクターと競合します。

派生レコード型では、明示的なコピー コンストラクターは、 : this() 初期化子を使用して基本型のコピー コンストラクターを呼び出す必要があります。 レコードが System.Objectから直接継承する場合は、代わりにパラメーターなしのオブジェクト コンストラクターを呼び出すことができます (CS8868)。

レコード には、コンパイラで合成された コピー コンストラクターが含まれます。 明示的なコピー コンストラクターは記述できますが、特定の要件を満たしている必要があります。 レコード コピー コンストラクターが次の要件に違反すると、コンパイラによってエラーが生成されます。

  • 基本型には、アクセス可能なコピー コンストラクターが必要です。 すべての record 型には、コピー コンストラクターがあります。 基本型が recordであることを確認するか、アクセス可能なコピー コンストラクターを追加します (CS8867)。
  • 派生レコード型では、明示的なコピー コンストラクターは、 : base() 初期化子を使用して基本型のコピー コンストラクターを呼び出す必要があります。 レコードが System.Objectから直接継承する場合は、代わりにパラメーターなしのオブジェクト コンストラクターを呼び出すことができます (CS8868)。
  • コピー コンストラクターは、レコードの種類がpublicされていない限り、protectedまたはsealedする必要があります。 コピー コンストラクターに適切なアクセス修飾子を追加します (CS8878)。
  • 明示的なコピーコンストラクタが、合成されたコピーコンストラクタと同じシグネチャを持つ場合、定義が競合します。 明示的なコピー コンストラクターを削除するか、その署名を変更します (CS8910)。

モジュール初期化子の宣言

  • CS8813: モジュール初期化子は通常のメンバー メソッドである必要があります。
  • CS8814: モジュール初期化子メソッド 'method' にモジュール レベルでアクセスできる必要があります。
  • CS8815: モジュール初期化子メソッド 'method' は静的で、非仮想である必要があり、パラメーターを持たなければならず、'void' を返す必要があります。
  • CS8816: モジュール初期化子メソッド 'method' はジェネリックではなく、ジェネリック型に含めてはなりません。
  • CS8900: モジュール初期化子を 'UnmanagedCallersOnly' に属性付けすることはできません。
  • CS8901: 'method' は 'UnmanagedCallersOnly' に属性付けされており、直接呼び出すことはできません。このメソッドへの関数ポインターを取得します。
  • CS8902: 'method' は 'UnmanagedCallersOnly' に属性付けされており、デリゲート型に変換できません。このメソッドへの関数ポインターを取得します。

これらのエラーにより、 ModuleInitializerAttributeでマークされたメソッドの要件が適用されます。 モジュール初期化子は、モジュール内の他のコードが実行される前に、アセンブリが最初に読み込まれるときに自動的に実行されます。 完全な規則については、「 モジュール初期化子」を参照してください。

これらのエラーを修正するには、特定の診断に基づいて次のいずれかの変更を適用します。

  • [ModuleInitializer]でマークされたメソッドが、プロパティ アクセサー、イベント アクセサー、ローカル関数、ラムダ、コンストラクター、デストラクター、または演算子 (CS8813) ではなく、通常のメソッドであることを確認します。 コンパイラは、通常のメソッド宣言をモジュール初期化子インフラストラクチャの有効なターゲットとしてのみ扱うことができます。
  • モジュール初期化子メソッドとそのすべての包含型を internal または public して、最上位の型 (CS8814) の外部からメソッドにアクセスできるようにします。 ランタイムは、生成されたモジュール レベルのコードからメソッドを呼び出す必要があります。これには、モジュール レベルでのアクセシビリティが必要です。
  • モジュール初期化子メソッドを、 static、非仮想、パラメーターなし、および void 戻り値の型 (CS8815) として宣言します。 ランタイムは、引数を指定せずにモジュール初期化子を呼び出し、結果を破棄するため、メソッドシグネチャはこれらの制約と正確に一致する必要があります。
  • モジュール初期化子メソッドからジェネリック型パラメーターを削除し、メソッドを任意のジェネリック包含型 (CS8816) から移動します。 ランタイムは初期化子の呼び出し時に指定する型引数を決定できないため、ジェネリック型のジェネリック メソッドとメソッドは許可されません。
  • モジュール初期化子メソッド (UnmanagedCallersOnlyAttribute) からを削除します。 モジュール初期化子はマネージド ランタイム インフラストラクチャによって呼び出されるため、アンマネージ呼び出し元のみに制限することはできません。
  • [UnmanagedCallersOnly]でマークされたメソッドを直接呼び出す代わりに、関数ポインターを取得します (CS8901)。 UnmanagedCallersOnlyAttributeで属性付きメソッドをマネージド コードから呼び出すことはできません。 &演算子を使用して、delegate* unmanaged<...> コンテキストで関数ポインター (unsafe) を取得し、アンマネージ コードにポインターを渡します。 プロジェクトで安全でないコードがまだ許可されていない場合は、 AllowUnsafeBlocksを有効にします。
  • [UnmanagedCallersOnly]でマークされたメソッドをデリゲート型 (CS8902) に変換する代わりに、関数ポインターを取得します。 呼び出し規則に互換性がないため、 UnmanagedCallersOnlyAttribute で属性付きメソッドをマネージド デリゲートとして表すことはできません。 代わりに、delegate* unmanaged<...> コンテキストで関数ポインター (unsafe) を使用します。 プロジェクトで安全でないコードがまだ許可されていない場合は、 AllowUnsafeBlocksを有効にします。

詳細については、「ModuleInitializerAttributeUnmanagedCallersOnlyAttribute」を参照してください。

プライマリ コンストラクターの宣言

プライマリ コンストラクターは、 型宣言でパラメーターを直接宣言します。 コンパイラは、メンバーまたはフィールド初期化子で使用するときに、プライマリ コンストラクター パラメーターを格納するフィールドを合成します。

コンストラクター チェーン

  • CS8861: 予期しない引数リスト。
  • CS8862: パラメーター リストを持つ型で宣言されたコンストラクターには、'this' コンストラクター初期化子が必要です。
  • CS9122: 予期しないパラメーター リスト。

型にプライマリ コンストラクターがある場合、他のすべての明示的に宣言されたコンストラクターは、 : this(...)を使用してそれに連結する必要があります。

これらのエラーを修正するには、次の推奨事項を試してください。

  • 明示的に宣言されたすべてのコンストラクターはプライマリ コンストラクター (: this(...)) にチェーンする必要があるため、プライマリ コンストラクターに適切な引数を渡す初期化子を追加します。
  • 基本型にプライマリ コンストラクターがない場合は、基本型参照からパラメーター リストを削除します。構文 class Derived : Base(args) は、 Base がプライマリ コンストラクター (CS8861) を持つ場合にのみ有効であるためです。
  • インターフェイスはプライマリ コンストラクター (interface) を持つことができないため、宣言からプライマリ コンストラクター パラメーター リストを削除します。

基本コンストラクター呼び出しでのパラメーターの使用

  • CS9105: このコンテキストでは、プライマリ コンストラクター パラメーターを使用できません。
  • CS9106: 識別子は、このコンテキストの型とパラメーターの間であいまいです。

プライマリ コンストラクターのパラメーターは、プライマリ コンストラクター宣言の一部として渡す場合にのみ、基本コンストラクター呼び出しで使用できます。

これらのエラーを修正するには、次の推奨事項を試してください。

  • プライマリ コンストラクター パラメーターは型宣言の基本句 (: base()) でのみ使用できるため、明示的に宣言されたコンストラクターの呼び出しで使用するのではなく、型宣言の基本句にパラメーターの使用法を移動します。
  • 参照があいまいになるため、型とプライマリ コンストラクター パラメーターが同じ名前を共有する場合は、型またはパラメーターの名前を変更します (CS9106)。

参照型に似たパラメーター

  • CS9108: 匿名メソッド、ラムダ式、クエリ式、またはローカル関数内で ref のような型を持つパラメーターを使用できません。
  • CS9109: インスタンス メンバー内で refout、またはプライマリ コンストラクター パラメーター in 使用できません。
  • CS9110: インスタンス メンバー内に ref のような型を持つプライマリ コンストラクター パラメーターを使用できません。
  • CS9136: インスタンス メンバー内で型のプライマリ コンストラクター パラメーターを使用できません。

これらのエラーに対処するには:

  • ref struct型のプライマリ コンストラクター パラメーターには、使用できる場所に制限があります。 ラムダ式、クエリ式、またはローカル関数 (CS9108) からパラメーター アクセスを移動します。 ref structされていない型では、インスタンス メンバー (ref structCS9136) ではなく、フィールド初期化子またはコンストラクター本体でのみパラメーターにアクセスします。
  • ref struct型の場合、インスタンス メソッドまたはプロパティ アクセサーで、inref、またはout修飾子でプライマリ コンストラクター パラメーターを使用することはできません。 パラメーター値をコンストラクターのフィールドにコピーし、代わりにインスタンス メンバーでそのフィールドを使用します (CS9109)。

構造体型の制限

  • CS9111: 構造体のインスタンス メンバー内の匿名メソッド、ラムダ式、クエリ式、およびローカル関数は、プライマリ コンストラクター パラメーターにアクセスできません。
  • CS9112: 構造体内の匿名メソッド、ラムダ式、クエリ式、およびローカル関数は、インスタンス メンバー内でも使用されるプライマリ コンストラクター パラメーターにアクセスできません。
  • CS9120: 参照によってプライマリ コンストラクター パラメーターを返すことはできません。
  • CS9121: 型の構造体のプライマリ コンストラクター パラメーターにより、構造体レイアウトにサイクルが発生します。

これらのエラーに対処するには:

  • 構造体型では、ラムダ式、クエリ式、またはインスタンス メンバー内のローカル関数でプライマリ コンストラクター パラメーターをキャプチャすることはできません。 これらのコンテキストで使用する前に、パラメーターをローカル変数またはフィールドにコピーします (CS9111CS9112)。
  • 構造体型では、参照によってプライマリ コンストラクター パラメーターを返すことはできません。 値をフィールドに格納し、必要に応じて参照でそのフィールドを返します (CS9120)。
  • プライマリ コンストラクター パラメーターの型によって構造体レイアウトにサイクルが作成されないようにします。 構造体には、直接または間接的に独自の型のフィールドを含めることはできません (CS9121)。

読み取り専用構造体の制限

  • CS9114: 読み取り専用型のプライマリ コンストラクター パラメーターを割り当てることはできません (型または変数初期化子の init 専用セッターを除く)。
  • CS9115: 読み取り専用型のプライマリ コンストラクター パラメーターは、書き込み可能な参照では返すことができません。
  • CS9116: 読み取り専用型のプライマリ コンストラクター パラメーターは、 ref 値または out 値として使用できません (型または変数初期化子の init 専用セッターを除く)。
  • CS9117: 読み取り専用型のプライマリ コンストラクター パラメーターのメンバーは変更できません (型または変数初期化子の init 専用セッターを除く)。
  • CS9118: 読み取り専用型のプライマリ コンストラクター パラメーターのメンバーは、書き込み可能な参照によって返すことができません。
  • CS9119: 読み取り専用型のプライマリ コンストラクター パラメーターのメンバーは、 ref 値または out 値として使用できません (型または変数初期化子の init 専用セッターを除く)。

これらのエラーに対処するには:

  • readonly struct型では、init 専用セッターまたは変数初期化子の外部でプライマリ コンストラクターパラメーターとそのメンバーを変更することはできません。 フィールド初期化子またはinit専用プロパティ セッター (CS9114CS9117) への割り当てを移動します。
  • readonly struct型の書き込み可能な参照では、プライマリ コンストラクターパラメーターとそのメンバーを返すことはできません。 readonly refまたは値で返します (CS9115CS9118)。
  • ref型では、プライマリ コンストラクターパラメーターとそのメンバーをoutまたはreadonly struct引数として渡すことはできません。 値で渡すか、 in 引数として渡します (CS9116CS9119)。

キャプチャされたパラメーターとシャドウされたパラメーターの警告

  • CS9107: パラメーターは外側の型の状態にキャプチャされ、その値も基本コンストラクターに渡されます。値は基底クラスによってもキャプチャされる場合があります。
  • CS9113: パラメーターが未読です。
  • CS9124: パラメーターは外側の型の状態にキャプチャされ、その値はフィールド、プロパティ、またはイベントの初期化にも使用されます。
  • CS9179: プライマリ コンストラクター パラメーターは、ベースのメンバーによってシャドウされます。

次の警告は、プライマリ コンストラクター パラメーターの格納またはアクセス方法に関する潜在的な問題を示しています。

  • パラメーターを基本コンストラクターに渡し、派生型でアクセスする場合は、パラメーターを 2 回格納できます。 基底クラスに 1 つのコピーがあり、派生クラスにもう 1 つのコピーがある場合があります。 両方のコピーが必要か、重複を回避するためにコードを再構築するかを検討します (CS9107)。
  • 読み取らない場合は、プライマリ コンストラクター パラメーターは必要ありません。 プライマリ コンストラクター宣言 (CS9113) から未使用のパラメーターを削除します。
  • 外側の型にパラメーターをキャプチャし、それをフィールド、プロパティ、またはイベントの初期化に使用する場合、パラメーターが 2 回格納されることがあります。 別のメンバー (CS9124) を初期化する代わりに、キャプチャされたパラメーターを直接使用することを検討してください。
  • 基本型メンバーは、どちらも同じ名前を持つ場合、プライマリ コンストラクター パラメーターをシャドウします。 混乱を避けるためにパラメーターの名前を変更します (CS9179)。