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

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

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

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

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

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

アクセサーのアクセシビリティ

  • CS0273: 'accessor' アクセサーがのアクセシビリティ修飾子は、プロパティまたはインデクサー 'property' よりも制限を厳しくする必要があります。
  • CS0274: プロパティまたはインデクサー 'property' の両方のアクセサーにアクセシビリティ修飾子を指定できません
  • CS0275: 'アクセサー': アクセシビリティ修飾子は、インターフェイスのアクセサーでは使用できません
  • CS0276: 'property': アクセサーのアクセシビリティ修飾子は、プロパティまたはインデクサーに get アクセサーと set アクセサーの両方がある場合にのみ使用できます
  • CS0442: 'property': 抽象プロパティにプライベート アクセサーを含めることはできません

これらのエラーにより、プロパティアクセサーとインデクサー アクセサーにアクセス修飾子の規則が適用されます。 完全な規則については、C# 仕様 でのアクセサーのアクセシビリティアクセサー の制限に関するページを参照してください。 これらのエラーを修正するには、特定の診断に基づいて次のいずれかの変更を適用します。

  • プロパティの宣言されたアクセシビリティ (CS0273) よりも制限の厳しいアクセス修飾子を使用します。 たとえば、 internal プロパティには private set アクセサーを含めることができますが、 public アクセサーは持つ必要はありません。 アクセサーのアクセシビリティは、プロパティのアクセシビリティの適切なサブセットである必要があります。
  • 2 つのアクセサー (CS0274) のいずれかにアクセス修飾子を適用します。 プロパティ宣言自体は両方のアクセサーの既定のアクセシビリティを確立し、その既定値と異なるアクセサーは 1 つだけです。 アクセスの制限が必要なアクセサーにアクセス修飾子を配置します。
  • インターフェイス プロパティ宣言 (CS0275) のアクセサーからアクセス修飾子を削除します。 インターフェイス メンバーはパブリック コントラクトを定義し、個々のアクセサーのアクセス修飾子は許可されません。 アクセスを制限する必要がある場合は、代わりに実装クラスで制限を適用します。
  • いずれかのプロパティにアクセス修飾子を適用する前に、プロパティに get アクセサーと set アクセサーの両方を追加します (CS0276)。 アクセサーのアクセス修飾子は、一方のアクセサーの可視性を他方のアクセサーと区別します。この場合、両方のアクセサーが存在する必要があります。 プロパティにアクセサーが 1 つしかない場合は、そのアクセサーからアクセス修飾子を削除します。
  • 抽象プロパティ アクセサーのアクセス修飾子を private から制限の緩い修飾子 (CS0442) に変更します。 抽象メンバーは、これらのクラスが実装を提供できるように、派生クラスからアクセスできる必要があります。 protectedの代わりに、internalprotected internal、またはprivateを使用します。

詳細については、「 アクセサーのアクセシビリティプロパティの制限」を参照してください。

プロパティ宣言の構文

  • CS0547: 'property': プロパティまたはインデクサーに void 型を指定することはできません
  • CS0548: 'property': プロパティまたはインデクサーには、少なくとも 1 つのアクセサーが必要です
  • CS0571: 'function' : 演算子またはアクセサーを明示的に呼び出すことはできません
  • CS0610: フィールドまたはプロパティを 'type' 型にすることはできません
  • CS0840: 'Property name' は抽象または extern とマークされていないため、本文を宣言する必要があります。自動的に実装されるプロパティは、get アクセサーと set アクセサーの両方を定義する必要があります。
  • CS1014: get アクセサーまたは set アクセサーが必要です
  • CS1043: { または ; が必要です

これらのエラーにより、プロパティ宣言とインデクサー宣言の構造要件が強制されます。 完全な規則については、C# 仕様の 「プロパティ 」および 「プロパティ」 セクションを参照してください。 これらのエラーを修正するには、特定の診断に基づいて次のいずれかの変更を適用します。

  • プロパティの型を void から有効な型 (CS0547) に変更します。 プロパティとインデクサーは式を表し、 void は有効な式型ではありません。 プロパティが表すデータに適した型を選択します。
  • プロパティ宣言 (get) に少なくとも 1 つのアクセサー (setinit、または) を追加します。 アクセサーのないプロパティには、その値を読み書きする方法はありません。 get アクセサー、set または init アクセサー、またはその両方を含めます。
  • アクセサー メソッドを直接呼び出すのではなく、プロパティ構文を使用してプロパティにアクセスします (CS0571)。 プロパティ アクセサーは、 get_PropertyName および set_PropertyNameという名前のメソッドにコンパイルされますが、プロパティ構文 (obj.Propertyobj.Property = value) を使用してこれらのメソッドを呼び出します。 演算子にも同じ原則が適用されます。 ++objなどのメソッドを呼び出す代わりに、演算子構文 (op_Increment) を使用します。
  • フィールドまたはプロパティの型を制限された型から許可された型 (CS0610) に変更します。 TypedReferenceArgIteratorなどの特定の型は、フィールドやプロパティとして使用できません。 これらの型は、メソッド パラメーターまたはローカル変数として引き続き使用できます。
  • 読み取り専用プロパティの場合は、 get専用の自動実装プロパティを宣言します。 それ以外の場合は、 get アクセサーと set アクセサーの両方を自動実装プロパティ宣言に追加するか、明示的なアクセサー本体 (CS0840) を指定します。 カスタム ロジックが必要なプロパティの場合は、C# 13 で追加された field キーワードを使用して、アクセサー本体のコンパイラ合成バッキング フィールドにアクセスします。 abstractプロパティまたはexternプロパティの場合は、実装が他の場所で提供されているため、アクセサー本体を削除します。 partialプロパティの場合は、宣言と実装を部分型宣言に分割します。
  • プロパティ本体に有効なアクセサー キーワード (getset、または init (CS1014) のみが含まれていることを確認します。 プロパティ本体には、任意のステートメントやメンバー宣言を含めることはできません。 プロパティの外部にあるフィールドとメソッドをクラスまたは構造体本体に移動します。
  • 中かっこまたは式本体 (CS1043) で適切なプロパティ アクセサー構文を使用します。 Accessor 本文は、中かっこ { } を使用する必要があります。式形式のアクセサーがでは、=> 構文を使用し、自動実装されたプロパティは、アクセサーが トークンの後にセミコロンで終了する必要があります。

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

プロパティのオーバーライド

  • CS0544: 'property': 'member' がプロパティではないため、オーバーライドできません
  • CS0545: 'function' : 'property' にオーバーライド可能な get アクセサーがないため、オーバーライドできません
  • CS0546: 'アクセサ': 'property' にオーバーライド可能な set アクセサが存在しないため、オーバーライドできません
  • CS1715: 'type': オーバーライドされたメンバー 'member' と一致させるには、型を 'type' にする必要があります
  • CS8080: 自動実装プロパティは、オーバーライドされたプロパティのすべてのアクセサーをオーバーライドする必要があります。

これらのエラーにより、派生クラスのプロパティをオーバーライドするための規則が適用されます。 完全な規則については、C# 仕様の 「継承 」および「 仮想、シール、オーバーライド、および抽象アクセサー 」セクションを参照してください。 これらのエラーを修正するには、特定の診断に基づいて次のいずれかの変更を適用します。

  • オーバーライドするメンバーが、フィールドまたはメソッドではなくプロパティであることを確認します (CS0544)。 プロパティの override キーワードは、基底クラスの virtualabstract、または override プロパティのみを対象とすることができます。 プロパティを持つプロパティ以外のメンバーをシャドウするには、newの代わりに override キーワードを使用します。
  • 基底クラスのプロパティ宣言 (CS0545、CS0546) に存在するアクセサーのみをオーバーライドします。 オーバーライドする仮想メソッドがないため、基底クラスに存在しない、またはアクセスできないプロパティ アクセサーをオーバーライドすることはできません。 基底クラスのプロパティに get アクセサーのみが含まれている場合、オーバーライドを使用して set アクセサーを追加することはできません。 不足しているアクセサーを基底クラスに追加して virtualマークするか、 new を使用して基底クラスのプロパティを新しいプロパティ定義で非表示にします。
  • オーバーライドするプロパティの型を、オーバーライドされたメンバーの型 (CS1715) と一致させます。 読み取り専用 (get のみ) プロパティは、C# 9 から共変戻り値型をサポートするため、オーバーライドでは、より派生型を返すことができます。 ただし、 set または init アクセサーを持つプロパティでは、セッターが宣言された型の値を受け入れるため、完全に一致する型が必要です。 セッターを持つプロパティに別の型が必要な場合は、基底クラスの宣言に一致するように派生クラスのプロパティ型を変更するか、セッターを削除し、代わりに共変の戻り値の型を使用します。
  • 自動実装プロパティ (CS8080) でオーバーライドする場合は、基本プロパティのすべてのアクセサーを含めます。 自動実装プロパティはストレージ実装とアクセサー実装の両方を生成するため、基底クラスに存在するすべてのアクセサーをオーバーライドする必要があります。 基本プロパティに getsetの両方がある場合は、自動実装のオーバーライドにも両方が必要です。 特定のアクセサーのみをオーバーライドするには、自動実装を使用する代わりに、明示的なアクセサー本体と明示的なバッキング フィールドを使用してプロパティを実装します。

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

バッキング フィールド付きプロパティ

  • CS9258: この言語バージョンでは、'field' キーワードは、プロパティの合成されたバッキング フィールドにバインドされます。合成されたバッキング フィールドの生成を回避し、既存のメンバーを参照するには、代わりに 'this.field' または '@field' を使用します。
  • CS9263: 部分プロパティは、定義と実装の両方に初期化子を持つことはできません。
  • CS9264: null 非許容プロパティ 'property' には、コンストラクターを終了するときに null 以外の値を含める必要があります。'required' 修飾子を追加するか、プロパティを null 許容として宣言するか、'field' が 'get' アクセサーで null である場合に安全に処理することを検討してください。
  • CS9266: プロパティ 'property' の 'accessor' アクセサーは、他のアクセサーが使用中のため '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: 静的メンバー 'member' を 'readonly' とマークすることはできません。
  • CS8658: 自動実装された 'set' アクセサーを 'readonly' としてマークすることはできません。
  • CS8659: 自動実装プロパティ 'property' には 'set' アクセサーがあるため、'readonly' とマークできません。
  • CS8660: プロパティまたはインデクサー 'property' とそのアクセサーの両方に 'readonly' 修飾子を指定できません。そのうちの 1 つを削除します。
  • CS8661: プロパティまたはインデクサー 'property' の両方のアクセサーで 'readonly' 修飾子を指定できません。代わりに、プロパティ自体に 'readonly' 修飾子を配置します。
  • CS8664: 'property': 'readonly' は、プロパティまたはインデクサーに get アクセサーと set アクセサーの両方がある場合にのみ使用できます

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

  • プロパティに set または init アクセサーを追加して書き込み可能にする (CS0200)。 set アクセサーのないプロパティは読み取り専用であり、宣言する型のコンストラクターまたはフィールド初期化子でのみ割り当てることができるため、この修正が必要です。 オブジェクトの初期化中にプロパティを設定する必要があるが、後で変更できない場合は、init アクセサーの代わりに set アクセサーを使用します。 プロパティを読み取り専用のままにする必要がある場合は、初期化が許可されているコンストラクターに割り当てを移動するか、割り当てが必要かどうかを再検討します。
  • 自動実装されたインスタンス プロパティを readonly struct で宣言する際は、readonly としてマークします (CS8341)。 この修正により、包含構造体の不変性コントラクトが適用され、すべてのインスタンス メンバーが 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 キーワード、および プロパティ」を参照してください。

Init のみのプロパティ

  • CS8852: Init 専用プロパティまたはインデクサー 'property' は、オブジェクト初期化子、またはインスタンス コンストラクターまたは 'init' アクセサーの 'this' または 'base' でのみ割り当てることができます。
  • CS8853: 'member' は、オーバーライドされたメンバー 'member' の init 専用と一致する必要があります。
  • CS8855: アクセサー 'accessor' および 'accessor' は、init 専用であるかどちらでもない必要があります。
  • CS8856: 'init' アクセサーは静的メンバーでは無効です
  • CS8903: 'init' アクセサーを 'readonly' としてマークすることはできません。代わりに 'property' を 'readonly' としてマークしてください。

これらのエラーにより、 init アクセサーの規則が適用され、変更できないオブジェクトの初期化が可能になります。 完全なルールについては、 init キーワードを参照してください。 これらのエラーを修正するには、特定の診断に基づいて次のいずれかの変更を適用します。

  • オブジェクト初期化子やコンストラクター、あるいは init アクセサー (CS8852) に、init 専用プロパティへの割り当てを移動してください。 オブジェクトの構築が完了した後は、Init のみのプロパティを割り当てることはできません。 コンストラクター本体、 init アクセサー、またはオブジェクト初期化子式 (new MyType { Property = value }) の値を割り当てます。 構築後にプロパティを割り当てる必要がある場合は、 init アクセサーを set アクセサーに変更します。
  • プロパティをオーバーライドするときには、init または set のアクセサーの種類に一致させてください (CS8853)。 基底クラス プロパティで init アクセサーを使用する場合、オーバーライドするプロパティも init を使用する必要があります。 同様に、ベースで setを使用する場合、オーバーライドでは setを使用する必要があります。 この一貫性により、基本型によって確立された不変性コントラクトが派生型に保持されます。
  • 明示的なインターフェイス実装 (init) の両方のアクセサーで同じアクセサーの種類 (setまたは) を使用します。 型が同じプロパティを宣言する 2 つのインターフェイスを明示的に実装する場合、両方のアクセサー実装が同意する必要があります。両方とも、 init を使用するか、両方とも setを使用します。
  • 静的プロパティ宣言から init アクセサーを削除するか、 set アクセサー (CS8856) に変更します。 init アクセサーは、オブジェクトの構築に関連付けられたインスタンス初期化パターン用に設計されており、静的メンバーはオブジェクトの初期化に参加しません。 変更可能な静的プロパティには set アクセサーを使用するか、読み取り専用の静的プロパティのセッターを完全に削除します。
  • readonly アクセサー (init) から修飾子を削除します。 構造体メンバーの readonly 修飾子は、メンバーが構造体インスタンスを変更しないことを保証します。 init アクセサーはインスタンスの状態に割り当てられるため、本質的に構造体を変更し、readonlyマークすることはできません。 get アクセサーをreadonlyにするには、readonly修飾子を get アクセサーにのみ適用します。

詳細については、「 init キーワード 」および「 オブジェクト初期化子」および「コレクション初期化子」を参照してください。

プロパティの初期化子

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

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

  • アクセサー本体を削除し、コンパイラがバッキング フィールド (CS8050) を生成できるようにすることで、自動実装構文を使用するようにプロパティを変換します。 この修正は、コンパイラで管理されるストレージを持つプロパティのみが初期化子を持つ可能性があり、アクセサー ロジックが実行される前に初期化が行われるために必要です。 または、 field キーワードを使用してコンパイラ合成バッキング フィールドにアクセスするようにアクセサーの実装を変更します。 この方法では、カスタム アクセサー ロジックを維持しながら初期化子を有効にします。 どちらの方法も適切でない場合は、初期化子を削除し、代わりにコンストラクターの値を割り当てます。この場合、初期化シーケンスを完全に制御できます。
  • get アクセサーを自動実装プロパティに追加して、初期化された値 (CS8051) の読み取りを有効にします。 初期化子が取得可能である必要がある値を設定し、書き込み専用プロパティがプロパティ初期化のこの基本的な期待に違反するため、この修正が必要です。 書き込み専用プロパティが本当に必要な場合は、バッキング フィールドを使用してアクセサーを明示的に実装し、プロパティ初期化子を使用するのではなく、コンストラクターでフィールドを直接割り当てます。
  • インターフェイス プロパティ宣言 (CS8053) から初期化子を削除します。 インターフェイスでは、初期値を使用して具体的な実装を提供するのではなく、型を実装するためのコントラクトを定義するため、この修正が必要です。 既定値を指定する必要がある場合は、インターフェイスを実装するクラスにプロパティを実装するか、既定のインターフェイス メソッド (C# 8.0 以降で使用可能) を使用して既定の実装を提供します。

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

必須メンバー

  • CS9029: 型とエイリアスに 'required' という名前を付けることはできません。
  • CS9030: 'member' は必要なメンバー 'member' をオーバーライドするため、必須である必要があります
  • CS9031: 必須メンバー 'member' を 'member' で非表示にすることはできません。
  • CS9032: 必須メンバーは、含まれる型より可視性を低くしたり、型より可視性の低い setter を持たせたりすることはできません。
  • CS9033: 'System.Runtime.CompilerServices.RequiredMemberAttribute' を使用しないでください。代わりに、必須フィールドとプロパティに対して 'required' キーワードを使用してください。
  • CS9034: 必須メンバーは設定可能である必要があります。
  • CS9035: 必須メンバーは、オブジェクト初期化子または属性コンストラクターで設定する必要があります。
  • CS9036: 必須メンバー 'memberName' には値を割り当てる必要があります。入れ子になったメンバーまたはコレクション初期化子を使用することはできません。
  • CS9037: 'type' に必要なメンバー リストの形式が正しくありません。解釈できません。
  • CS9038: 基本型 'type' に必要なメンバー リストの形式が正しくなっていないため、解釈できません。このコンストラクターを使用するには、'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 ローカル」および「プロパティ」を参照してください。