次の方法で共有


プロパティ宣言に関連するエラーと警告

プロパティ宣言に関連する次のエラーが発生する可能性があります。

  • CS0200: プロパティまたはインデクサー 'property' を割り当てることができません。読み取り専用です
  • CS0545: 'function' : 'property' にオーバーライド可能な get アクセサーがないため、オーバーライドできません
  • CS0571: 'function' : 演算子またはアクセサーを明示的に呼び出すことはできません
  • CS0840: 'Property name' は抽象または extern とマークされていないため、本文を宣言する必要があります。自動的に実装されるプロパティは、get アクセサーと set アクセサーの両方を定義する必要があります。
  • CS1014: get アクセサーまたは set アクセサーが予期されています
  • CS1043: { または ; が必要です
  • CS8050: 初期化子を含めることができるのは、自動実装プロパティ ('field' キーワードを使用するプロパティ) のみです
  • CS8051: 自動実装プロパティには get アクセサーが必要です
  • CS8053: インターフェイス内のインスタンス プロパティに初期化子を含めることはできません
  • CS8145: 自動実装プロパティは参照で返すことができません
  • CS8147: 参照によって返されるプロパティに set アクセサーを含めることはできません
  • CS8341: 読み取り専用構造体の自動実装インスタンス プロパティを読み取り専用にする必要がある
  • CS8657: 静的メンバーを 'readonly' とマークできません
  • CS8658: 自動実装された 'set' アクセサーは 'readonly' に設定できません
  • CS8659: 自動実装プロパティには 'set' アクセサーがあるため、'readonly' とマークできません
  • CS8660: プロパティとそのアクセサーの両方に 'readonly' 修飾子を指定できません
  • CS8661: プロパティの両方のアクセサーに 'readonly' 修飾子を指定できません
  • CS8664: プロパティに get と set の両方がある場合にのみ、アクセサーで 'readonly' を使用できます
  • CS9029: 型とエイリアスに 'required' という名前を付けることはできません。
  • CS9030: 必要なメンバーをオーバーライドするため、メンバーが必要です。
  • CS9031: 必須メンバーを派生メンバーで非表示にすることはできません。
  • CS9032: 必須メンバーは、含まれている型よりも可視性が低い、またはセッターの可視性がそれより低いことはできません。
  • CS9033: 'System.Runtime.CompilerServices.RequiredMemberAttribute' を使用しないでください。代わりに、必須フィールドとプロパティに対して 'required' キーワードを使用してください。
  • CS9034: 必須メンバーは設定可能である必要があります。
  • CS9035: 必須メンバーは、オブジェクト初期化子または属性コンストラクターで設定する必要があります。
  • CS9036: 必須メンバー 'memberName' には値を割り当てる必要があります。入れ子になったメンバーまたはコレクション初期化子を使用することはできません。
  • CS9037: 必要なメンバー リストの形式が正しくありません。解釈できません。
  • CS9038: 基本型に必要なメンバー リストの形式が正しくないため、解釈できません。このコンストラクターを使用するには、'SetsRequiredMembers' 属性を適用します。
  • CS9039: このコンストラクターは、その属性を持つコンストラクターにチェーンされるため、'SetsRequiredMembers' を追加する必要があります。
  • CS9040: 型には必須のメンバーがあるため、ジェネリック型またはメソッドのパラメーターに対する 'new()' 制約を満たすことはできません。
  • CS9042: 必須メンバーは、含まれる型が古い場合、またはすべてのコンストラクターが古い場合を除き、'ObsoleteAttribute' に属性付けしないでください。
  • CS9045: 必須メンバーは、スクリプトまたは申請の最上位レベルでは許可されません。
  • CS9258: この言語バージョンでは、'field' キーワードは、プロパティの合成されたバッキング フィールドにバインドされます。合成されたバッキング フィールドが生成されないようにし、既存のメンバーを参照するには、代わりに 'this.field' または '@field' を使用します。
  • CS9263: A 部分プロパティは、定義と実装の両方で初期化子を持つことはできません。

フィールドに基づくプロパティに対して、次の警告を生成できます。

  • CS9264: null 非許容プロパティは、コンストラクターを終了するときに null 以外の値を含める必要があります。'required' 修飾子を追加するか、プロパティを null 許容として宣言するか、'[field: MaybeNull, AllowNull]' 属性を追加することを検討してください。
  • CS9266: 他のアクセサーが使用しているため、プロパティの 1 つのアクセサーは 'field' を使用する必要があります。
  • CS9273: この言語バージョンでは、'field' はプロパティ アクセサー内のキーワードです。変数の名前を変更するか、代わりに識別子 '@field' を使用します。

次のセクションでは、これらのエラーと警告の原因と修正について説明します。

プロパティ アクセサーの構文

  • CS0545: 'function' : 'property' にオーバーライド可能な get アクセサーがないため、オーバーライドできません
  • CS0571: 'function' : 演算子またはアクセサーを明示的に呼び出すことはできません
  • CS1043: { または ; が必要です

プロパティ アクセサー構文エラーを修正するには、特定の診断に基づいて次のいずれかの変更を適用します。

基底クラスのプロパティ宣言 (CS0545) に存在するアクセサーのみをオーバーライドします。 コンパイル済みの IL にはオーバーライドするための仮想メソッドが存在しないため、基底クラスにない、またはアクセスできないプロパティ アクセサーをオーバーライドすることはできません。 基底クラスのプロパティに get アクセサーしかない場合は、オーバーライドから set アクセサーを削除するか、不足しているアクセサーを基底クラスに追加して virtualマークします。 または、newの代わりに override キーワードを使用して、アクセサーが異なる完全に新しいプロパティ定義を持つ基底クラス プロパティを非表示にします。

アクセサー メソッドを直接呼び出すのではなく、プロパティ構文を使用してプロパティにアクセスします (CS0571)。 プロパティ アクセサーは、 get_PropertyNameset_PropertyNameなどの名前を持つ特殊なメソッドにコンパイルされますが、プロパティ構文 (obj.Propertyobj.Property = value) を使用してこれらのメソッドを呼び出す必要があります。 この方法では、適切なセマンティクスが維持され、コンパイラは必要なチェックを実行できます。 演算子にも同じ原則が適用され、 op_Increment などのメソッドにコンパイルされますが、メソッド呼び出しではなく、演算子構文 (++obj) を使用して呼び出す必要があります。

中かっこまたは式本体 (CS1043) で適切なプロパティ アクセサー構文を使用します。 プロパティ アクセサーは C# 構文規則に従う必要があります。アクセサー本体は中かっこ { }で囲む必要があり、式形式のアクセサーは => 構文を使用する必要があり、自動実装プロパティはアクセサー リストの後にセミコロンで終わる必要があります。 コンパイラは、完全なアクセサー実装または自動実装アクセサーを示すセミコロンを想定しています。

詳細については、「プロパティ、継承、およびプロパティの使用」を参照してください

自動実装プロパティ

  • CS0840: 'Property name' は抽象または extern とマークされていないため、本文を宣言する必要があります。自動的に実装されるプロパティは、get アクセサーと set アクセサーの両方を定義する必要があります。
  • CS1014: get アクセサーまたは set アクセサーが必要です

自動実装プロパティ エラーを修正するには、特定の診断に基づいて次のいずれかの変更を適用します。

プロパティ宣言 (get) にsetアクセサーと アクセサーの両方を追加します。 自動実装プロパティでは、コンパイラがバッキング フィールドを生成する必要があります。コンパイラは、両方のアクセサーが存在する場合にのみこれを行い、ストレージを読み取りと書き込みの両方に使用できるようにします。 読み取り専用の自動実装プロパティが必要な場合は、 set アクセサーを含め、コンパイラがバッキング フィールドを生成できるようにしながら、書き込みアクセスを制限する private にします。 または、プロパティが abstract または externとして宣言されている場合は、これらの修飾子は実装が他の場所で提供されていることを示しているため、アクセサー本体を完全に削除します。 partialプロパティの場合は、宣言と実装を部分型宣言に分割できます。

プロパティ宣言に、 get および set (CS1014) の有効なアクセサー キーワードのみが含まれていることを確認します。 プロパティ構文ではアクセサー宣言のみが許可され、プロパティ本体内の任意のステートメントやメンバー宣言は許可されません。 追加のロジックが必要な場合は、コードを含む明示的なアクセサー本体でプロパティを実装します。 フィールドまたはメソッドを宣言しようとしている場合は、それらの宣言を、メンバー宣言が許可されているクラスまたは構造体本体にプロパティの外側に移動します。

詳細については、「 プロパティ」 および「 自動実装プロパティ」を参照してください。

フィールドベースのプロパティ

  • CS9258: この言語バージョンでは、'field' キーワードは、プロパティの合成されたバッキング フィールドにバインドされます。合成されたバッキング フィールドの生成を回避し、既存のメンバーを参照するには、代わりに 'this.field' または '@field' を使用します。
  • CS9263: 部分プロパティは、定義と実装の両方に初期化子を持つことはできません。
  • CS9264: null 非許容プロパティは、コンストラクターを終了するときに null 以外の値を含める必要があります。'required' 修飾子を追加するか、プロパティを null 許容として宣言するか、'[field: MaybeNull, AllowNull]' 属性を追加することを検討してください。
  • CS9266: 他のアクセサーが使用しているため、プロパティの 1 つのアクセサーは 'field' を使用する必要があります。
  • CS9273: この言語バージョンでは、'field' はプロパティ アクセサー内のキーワードです。変数の名前を変更するか、代わりに識別子 '@field' を使用します。

フィールドに基づくプロパティ エラーを修正するには、特定の診断に基づいて次のいずれかの変更を適用します。

fieldという名前の変数の名前を別の識別子に変更するか、@fieldエスケープ構文を使用して変数 (CS9258CS9273) を参照します。 この修正は、 field が C# 13 以降のプロパティ アクセサー内のコンテキスト キーワードであり、コンパイラ合成バッキング フィールドを参照しているために必要です。 合成されたバッキング フィールドではなく、 field という名前の既存のメンバーにアクセスする場合は、参照を明確にするために this.field で修飾します。

部分プロパティ定義または実装から初期化子を削除し、1 つだけを保持します (CS9263)。 両方の場所で初期化子を許可すると、使用する必要がある値があいまいになり、バッキング フィールドが潜在的に異なる値で 2 回初期化される可能性があるため、この修正が必要です。

[field: MaybeNull, AllowNull]属性をプロパティ宣言に追加して、バッキング フィールドを null 許容として扱う必要があることを示します (CS9264)。 この修正により、プロパティ型とコンパイラ合成バッキング フィールドの間で null 許容の期待値が調整され、プロパティが null 非許容として宣言されているが、 field キーワードの使用によって null である可能性が示唆される不一致が解決されます。 または、プロパティの型を null 許容に変更し、 required 修飾子を追加して初期化を保証するか、コンストラクターでプロパティを初期化します。

両方のアクセサーで field キーワードを常に使用するか、両方のアクセサーで明示的なバッキング フィールドを使用します (CS9266)。 この修正により、一方のアクセサーがコンパイラ合成バッキング フィールドを変更し、もう一方のアクセサーが別のストレージの場所を変更し、一貫性のないプロパティ動作が発生する可能性があるバグを防ぐことができます。

詳細については、 フィールド キーワード部分プロパティを参照してください。

Readonly プロパティ

  • CS0200: プロパティまたはインデクサー 'property' を割り当てることができません。読み取り専用です
  • CS8341: 読み取り専用構造体の自動実装インスタンス プロパティを読み取り専用にする必要がある
  • CS8657: 静的メンバーを 'readonly' とマークできません
  • CS8658: 自動実装された 'set' アクセサーは 'readonly' としてマークできません
  • CS8659: 自動実装プロパティには 'set' アクセサーがあるため、'readonly' とマークできません
  • CS8660: プロパティとそのアクセサーの両方に 'readonly' 修飾子を指定できません
  • CS8661: プロパティの両方のアクセサーに 'readonly' 修飾子を指定できません
  • CS8664: プロパティに get と set の両方がある場合にのみ、アクセサーで 'readonly' を使用できます

読み取り専用プロパティ エラーを修正するには、特定の診断に基づいて次のいずれかの変更を適用します。

プロパティに set または init アクセサーを追加して書き込み可能にする (CS0200)。 set アクセサーのないプロパティは読み取り専用であり、宣言する型のコンストラクターまたはフィールド初期化子でのみ割り当てることができるため、この修正が必要です。 オブジェクトの初期化中にプロパティを設定する必要があるが、後で変更できない場合は、init アクセサーの代わりに set アクセサーを使用します。 プロパティを読み取り専用のままにする必要がある場合は、初期化が許可されているコンストラクターに割り当てを移動するか、割り当てが必要かどうかを再検討します。

readonly (readonly struct) 内で宣言するときに、自動実装インスタンス プロパティをとしてマークします。 この修正により、包含構造体の不変性コントラクトが適用され、すべてのインスタンス メンバーが readonly 保証を尊重します。 プロパティを変更可能にする必要がある場合は、構造体宣言から readonly 修飾子を削除するか、インスタンスの状態を変更しない明示的なバッキング フィールドとアクセサー本体を持つプロパティを実装します。

静的プロパティまたはアクセサー宣言 (readonly) から修飾子を削除します。 この修正が必要なのは、 readonly 修飾子は構造体のインスタンス メンバーにのみ適用され、インスタンスの状態を変更しないことを示し、静的メンバーには保護するインスタンス状態がないためです。 読み取り専用の静的プロパティが必要な場合は、set修飾子を使用するのではなく、readonly アクセサーを省略します。

自動実装されたreadonly アクセサーからset修飾子を削除するか、get アクセサーにのみ適用します (CS8658)。 この修正は、 set アクセサーが本質的に状態を変更するため必要です。これは、インスタンス状態の変更を保証しない readonly 修飾子の目的と矛盾します。 初期化中に設定できるが、後で読み取り専用のプロパティが必要な場合は、init アクセサーの代わりに set アクセサーを使用します。

プロパティに readonly アクセサー (set) がある場合は、プロパティ宣言から修飾子を削除します。 この修正は、 set アクセサーを持つプロパティがインスタンスの状態を変更でき、 readonly 保証に違反するためです。 初期化時の設定のみが必要な場合は、 set アクセサーを init アクセサーに置き換えるか、プロパティを完全に読み取り専用にするために set アクセサーを完全に削除します。

プロパティ宣言または個々のアクセサーに readonly 修飾子を配置しますが、両方には配置しません (CS8660CS8661)。 この修正により、冗長な修飾子宣言が回避され、どの修飾子が優先されるのかを混乱させる可能性があります。 特定のアクセサーを readonlyとしてマークする場合は、プロパティ宣言から修飾子を削除し、アクセサーにのみ配置します。 または、すべてのアクセサーを readonlyする必要がある場合は、個々のアクセサーではなく、プロパティ自体をマークします。

個々のアクセサーを get (set) としてマークするときに、readonlyアクセサーと アクセサーの両方が存在することを確認します。 個々のアクセサーの readonly 修飾子は、状態を変更するアクセサーと変更しないアクセサーを区別するため、この修正が必要です。これは、両方のアクセサーの種類が存在する場合にのみ意味があります。 プロパティに get アクセサーしかない場合は、個々のアクセサーではなく、プロパティ全体を readonly としてマークします。

詳細については、「読み取り専用インスタンス メンバーinit キーワード、および プロパティ」を参照してください。

プロパティの初期化子

  • CS8050: 初期化子を含めることができるのは、自動実装プロパティ ('field' キーワードを使用するプロパティ) のみです
  • CS8051: 自動実装プロパティには get アクセサーが必要です
  • CS8053: インターフェイス内のインスタンス プロパティに初期化子を含めることはできません

プロパティ初期化子エラーを修正するには、特定の診断に基づいて次のいずれかの変更を適用します。

アクセサー本体を削除し、コンパイラがバッキング フィールド (CS8050) を生成できるようにすることで、自動実装構文を使用するようにプロパティを変換します。 この修正は、コンパイラで管理されるストレージを持つプロパティのみが初期化子を持つ可能性があり、アクセサー ロジックが実行される前に初期化が行われるために必要です。 または、 field キーワードを使用してコンパイラ合成バッキング フィールドにアクセスするようにアクセサーの実装を変更します。 この方法では、カスタム アクセサー ロジックを維持しながら初期化子を有効にします。 どちらの方法も適切でない場合は、初期化子を削除し、代わりにコンストラクターの値を割り当てます。この場合、初期化シーケンスを完全に制御できます。

get アクセサーを自動実装プロパティに追加して、初期化された値 (CS8051) の読み取りを有効にします。 初期化子が取得可能である必要がある値を設定し、書き込み専用プロパティがプロパティ初期化のこの基本的な期待に違反するため、この修正が必要です。 書き込み専用プロパティが本当に必要な場合は、バッキング フィールドを使用してアクセサーを明示的に実装し、プロパティ初期化子を使用するのではなく、コンストラクターでフィールドを直接割り当てます。

インターフェイス プロパティ宣言 (CS8053) から初期化子を削除します。 インターフェイスでは、初期値を使用して具体的な実装を提供するのではなく、型を実装するためのコントラクトを定義するため、この修正が必要です。 既定値を指定する必要がある場合は、インターフェイスを実装するクラスにプロパティを実装するか、既定のインターフェイス メソッド (C# 8.0 以降で使用可能) を使用して既定の実装を提供します。

詳細については、「 プロパティ」、 「自動実装プロパティ」、および 「フィールド キーワード」を参照してください。

必須メンバー

  • CS9029: 型とエイリアスに 'required' という名前を付けることはできません。
  • CS9030: 必要なメンバーをオーバーライドするため、メンバーが必要です。
  • CS9031: 必須メンバーを派生メンバーで非表示にすることはできません。
  • CS9032: 必須メンバーは、参照を減らしたり、セッターを含む型よりも見えにくくしたりすることはできません。
  • CS9033: 'System.Runtime.CompilerServices.RequiredMemberAttribute' を使用しないでください。代わりに、必須フィールドとプロパティに対して 'required' キーワードを使用してください。
  • CS9034: 必須メンバーは設定可能である必要があります。
  • CS9035: 必須メンバーは、オブジェクト初期化子または属性コンストラクターで設定する必要があります。
  • CS9036: 必須メンバー 'memberName' には値を割り当てる必要があります。入れ子になったメンバーまたはコレクション初期化子を使用することはできません。
  • CS9037: 必要なメンバー リストの形式が正しくありません。解釈できません。
  • CS9038: 基本型に必要なメンバー リストの形式が正しくないため、解釈できません。このコンストラクターを使用するには、'SetsRequiredMembers' 属性を適用します。
  • CS9039: このコンストラクターは、その属性を持つコンストラクターにチェーンされるため、'SetsRequiredMembers' を追加する必要があります。
  • CS9040: 型には必須メンバーがあるため、ジェネリック型またはメソッドのパラメーターに対する 'new()' 制約を満たすことはできません。
  • CS9042: 必須メンバーは、含まれる型が古い場合、またはすべてのコンストラクターが古い場合を除き、'ObsoleteAttribute' で属性化しないでください。
  • CS9045: 必須メンバーは、スクリプトまたは申請の最上位レベルでは許可されません。

必要なメンバー エラーを修正するには、特定の診断に基づいて次のいずれかの変更を適用します。

requiredを型またはエイリアス名 (CS9029) として使用しないでください。 この修正は、 required が C# 11 以降のコンテキスト キーワードであり、それを型名として使用すると、キーワードが出現する可能性があるコードであいまいさが生じるため、必要です。

必要なメンバー (required) をオーバーライドするときに、派生メンバーが 修飾子を維持していることを確認します。 この修正により、基底クラスによって確立されたコントラクトが適用され、すべての派生型が同じ初期化要件を維持することを保証します。 派生クラス (CS9031) で必要でないメンバーを含む必須メンバーを非表示にしないでください。このアクションは、コンシューマーが基本型から期待する初期化コントラクトを中断するためです。

必要なメンバーは、その包含型と同等以上の可視性を持ち、プロパティ セッターも十分に可視化されていることを確認します (CS9032)。 この修正により、型にパブリックにアクセスできるが、その型が構築されているすべてのコンテキストから必要なメンバーを初期化できない状況が回避されます。

required (RequiredMemberAttribute) を手動で適用する代わりに、 キーワードを使用します。 この修正により、コンパイラによって正しいメタデータが生成され、必要なすべてのメンバー 規則が適用されます。手動属性アプリケーションが正しく機能しない可能性があります。

必要なメンバーがアクセサーを設定しているか、それ以外の場合は設定可能であることを確認します (CS9034)。 この修正は、オブジェクトの作成時に必要なメンバーを初期化する必要があるために必要です。これには書き込みアクセスが必要です。 インスタンスを作成するときは、オブジェクト初期化子 (CS9035、CS9036) で必要なメンバー 直接初期化します。 必要なメンバー自体はプロパティにアクセスする前に設定する必要があるため、入れ子になったメンバー初期化子またはコレクション初期化子を使用するのではなく、必要な各メンバーに値を割り当てる必要があります。

SetsRequiredMembers属性を、本体 (CS9038、CS9039) 内のすべての必須メンバーを初期化するコンストラクター適用します。 この修正により、コンストラクターが必要なメンバー コントラクトを満たすことがコンパイラに通知され、オブジェクト初期化子を使用せずにオブジェクトを作成できるようになります。 コンストラクターが SetsRequiredMembers を使用して別のコンストラクターにチェーンする場合は、その属性も必要です。

パラメーターなしのコンストラクターはオブジェクト初期化子なしで必要なメンバーの初期化を保証できないため、 new() 制約 (CS9040) を満たす必要がある型では必須メンバーを使用しないでください。 メンバーが必要であるが使用が推奨されない状況を防ぐために、包含型またはすべてのコンストラクターが古い (CS9042) 場合を除き、必須のメンバーを古いものとしてマークしないでください。 必須メンバーは、最上位レベルのステートメントまたはスクリプト コンテキスト (CS9045) では許可されません。これらのコンテキストでは、必要なメンバーを設定するために必要なオブジェクト初期化構文がサポートされていないためです。

詳細については、 必要な修飾子 のリファレンス記事と オブジェクトおよびコレクション初期化子 ガイドを参照してください。

参照を返すプロパティ

  • CS8145: 自動実装プロパティは参照で返すことができません
  • CS8147: 参照によって返されるプロパティに set アクセサーを含めることはできません

ref 戻り値のプロパティ エラーを修正するには、特定の診断に基づいて次のいずれかの変更を適用します。

バッキング フィールドを使用してプロパティを明示的に実装し、ref アクセサーの戻り式 (get) で キーワードを使用します。 自動実装プロパティは、コンパイラが内部的に管理するプライベート バッキング フィールドを生成するため、この修正が必要です。 プライベート フィールドへの参照を返すと、呼び出し元が直接アクセスしてはならない内部ストレージが公開されます。 ref を返すプロパティを作成するには、明示的なフィールドを宣言し、 => ref backingField 構文で返します。 または、ストレージの直接変更を許可するために参照を返す必要がない場合は、プロパティ宣言から ref 修飾子を削除します。

ref 戻り値のプロパティ (set) から アクセサーを削除します。 ref を返すプロパティは、返された参照自体を通じて読み取りと書き込みの両方のアクセスを既に提供するため、この修正が必要です。 呼び出し元は、別のセッター メソッドを必要とせずに、参照を介して値を直接変更できます。 set アクセサーを含めると、同じストレージを変更するための 2 つの異なるメカニズムが作成されます。これは冗長であり、使用する必要がある変更パスについて混乱を招く可能性があります。

詳細については、「ref 戻り値」および「ref ローカル」および「プロパティ」を参照してください。