次の方法で共有


インターフェイスを実装するメンバーに関連するエラーと警告を解決する

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

  • CS0071: イベントの明示的なインターフェイス実装では、イベント アクセサー構文を使用する必要があります。
  • CS0106: 修飾子は、この項目に対して無効です。
  • CS0277: メンバーは、パブリックではないため、インターフェイス メンバーを実装しません。
  • CS0425: メソッドの型パラメーターの制約は、インターフェイス メソッドの型パラメーターの制約と一致する必要があります。代わりに明示的なインターフェイス実装を使用することを検討してください。
  • CS0460: オーバーライドおよび明示的なインターフェイス実装メソッドの制約は基本メソッドから継承されるため、'class' 制約または 'struct' 制約を除き、直接指定することはできません。
  • CS0470: メソッドは型のインターフェイス アクセサーを実装できません。明示的なインターフェイスの実装を使用します。
  • CS0473: 明示的なインターフェイス実装 'method name' は、複数のインターフェイス メンバーと一致します。実際に選択されるインターフェイス メンバーは、実装に依存します。代わりに、明示的でない実装を使用することを検討してください。
  • CS0531: インターフェイス メンバーは定義を持つことができません。
  • CS0535: メンバーがインターフェイスのメンバーを実装していません。
  • CS0538: 明示的なインターフェイス宣言のメンバーはインターフェイスではありません。
  • CS0539: 明示的なインターフェイス宣言のメンバーが、実装できるインターフェイスのメンバー間で見つかりません
  • CS0540: 型を含む場合、インターフェイス メンバーは実装されません。
  • CS0541: 明示的なインターフェイス宣言は、クラス、レコード、構造体、またはインターフェイスでのみ宣言できます。
  • CS0550: メンバーは、インターフェイス メンバーに見つからないアクセサーを追加します。
  • CS0551: 明示的なインターフェイスの実装にアクセサーがありません。
  • CS0630: メンバーには __arglist パラメーターがあるため、インターフェイス メンバーを実装できません。
  • CS0686: アクセサーはインターフェイス メンバーを実装できません。明示的なインターフェイスの実装を使用します。
  • CS0736: メンバーはインスタンス インターフェイス メンバーを実装しません。インターフェイス メンバーは静的であるため、実装できません。
  • CS0737: メンバーはインターフェイス メンバーを実装しません。インターフェイス メンバーはパブリックではないため、実装できません。
  • CS0738: メンバーはインターフェイス メンバーを実装しません。一致する戻り値の型がないため、できません。
  • CS8705: インターフェイス メンバーには、最も具体的な実装がありません。どちらのメンバーも最も具体的なものではありません。
  • CS8854: メンバーがインターフェイス メンバーを実装していません。
  • CS9333: パラメーター型は、実装されているメンバーと一致する必要があります。
  • CS9334: 戻り値の型は、実装されているメンバーと一致する必要があります。

インターフェイスの宣言と構文

次のエラーは、明示的なインターフェイス実装を宣言するときの適切な構文と構造に関連しています。

  • CS0071: イベントの明示的なインターフェイス実装では、イベント アクセサー構文を使用する必要があります。
  • CS0106: 修飾子は、この項目に対して無効です。
  • CS0531: インターフェイス メンバーは定義を持つことができません。
  • CS0538: 明示的なインターフェイス宣言のメンバーはインターフェイスではありません。
  • CS0541: 明示的なインターフェイス宣言は、クラス、レコード、構造体、またはインターフェイスでのみ宣言できます。

これらのエラーは、次の手法を使用して修正できます。

  • インターフェイス イベント (add) を明示的に実装する場合は、removeイベント アクセサーを手動で指定する必要があります。 コンパイラは、明示的なインターフェイス実装のためにこれらのアクセサーを自動的に生成しないため、イベントの格納方法と管理方法を指定するために明示的に定義する必要があります。
  • 明示的なインターフェイス実装 (public) から修飾子を削除します。 明示的なインターフェイス実装は、インターフェイス型を介してアクセスすると暗黙的にパブリックになり、 public キーワードが冗長になり、このコンテキストでは許可されません。
  • 明示的なインターフェイス実装 (abstract) から修飾子を削除します。 明示的なインターフェイス実装は実際の実装を提供し、派生クラスでオーバーライドできないため、抽象としてマークすることはできません。
  • インターフェイス メンバー宣言からメソッド本体を削除するか、実装をインターフェイスを実装するクラスまたは構造体 (CS0531) に移動します。 C# 8.0 より前では、インターフェイス メンバーに実装を含めることはできません。C# 8.0 以降では、特定の構文を使用して 既定のインターフェイス メソッドを 提供できます。
  • 明示的なインターフェイス宣言で指定された型が実際のインターフェイス型 (CS0538) であることを確認します。 明示的なインターフェイス実装構文では、インターフェイス型のみを使用できます。クラスまたはその他のインターフェイス以外の型を使用しようとすると、明示的な実装規則に違反します。
  • 明示的なインターフェイス宣言を、その基本リスト (CS0541) でインターフェイスを宣言するクラスまたは構造体に移動します。 明示的なインターフェイスの実装は、クラスまたは構造体型の本体内に記述する必要があり、名前空間レベルやその他のコンテキストでは宣言できません。

詳細については、「 インターフェイス」、 「明示的なインターフェイスの実装」、および 「インターフェイス イベントを実装する方法」を参照してください。

戻り値の型とシグネチャ

実装メソッドのシグネチャがインターフェイス メンバー宣言と一致しない場合、次のエラーが発生します。

  • CS0738: メンバーはインターフェイス メンバーを実装しません。一致する戻り値の型がないため、できません。
  • CS8854: メンバーはインターフェイス メンバーを実装しません。
  • CS9333: パラメーター型は、実装されているメンバーと一致する必要があります。
  • CS9334: 戻り値の型は、実装されているメンバーと一致する必要があります。

これらのエラーは、次の手法を使用して修正できます。

  • インターフェイス メンバー (CS0738CS9334) で宣言されている戻り値の型と完全に一致するように実装メソッドの戻り値の型を変更します。 メソッド シグネチャは実装するインターフェイス メンバーを決定するコントラクトの一部であるため、実装のシグネチャはインターフェイス宣言と正確に一致する必要があります。
  • 実装メソッドのパラメーター型が、インターフェイス メンバー (CS9333) で宣言されているパラメーター型と完全に一致していることを確認します。 各パラメーターは、インターフェイス宣言で指定されたのと同じ位置に同じ型を持つ必要があります。パラメーター型は、実装とインターフェイス メンバーを照合するためにコンパイラが使用するメソッド シグネチャの基本的なコンポーネントです。
  • インターフェイス プロパティが init セッター (init) を宣言するときに、 アクセサーを実装プロパティに追加します。 init キーワードを使用すると、オブジェクトの構築中にプロパティを初期化でき、その後の変更を防ぐことができます。実装プロパティは、インターフェイス コントラクトを満たすために、これと同じ初期化専用の動作を提供する必要があります。

詳細については、「 インターフェイスプロパティ、および Init 専用セッター」を参照してください。

実装が見つからないか不完全

クラスがインターフェイスを完全に実装できない場合、またはインターフェイス コントラクトに一致しないメンバーを実装すると、次のエラーが発生します。

  • CS0535: メンバーはインターフェイス メンバーを実装しません。
  • CS0550: メンバーは、インターフェイス メンバーに見つからないアクセサーを追加します。
  • CS0551: 明示的なインターフェイスの実装にアクセサーがありません。

これらのエラーは、次の手法を使用して修正できます。

  • インターフェイスで宣言されているすべてのメンバーの実装を指定するか、型を abstract (CS0535) として宣言します。 インターフェイスの要件を満たすために、各メンバーを実装する必要があります。
  • インターフェイス プロパティ (CS0550) で宣言されていないアクセサーを実装プロパティから削除します。 実装プロパティには、インターフェイス定義で明示的に宣言されたアクセサーのみを含めることができるため、実装ではインターフェイス コントラクトで指定されている機能を超える機能が追加されません。
  • インターフェイス宣言 (CS0551) に一致するように、必要なすべてのアクセサーを明示的なインターフェイス実装に追加します。 インターフェイスで宣言された各アクセサーは、対応するシグネチャを持つ実装内の対応するアクセサーを持つ必要があります。これは、実装がインターフェイスによって定義された完全なアクセサー コントラクトを満たす必要があります。

詳細については、「インターフェイスとプロパティを参照してください。

メンバーの一致と調整

次のエラーは、インターフェイスに存在しないインターフェイス メンバーを実装しようとしたとき、または包含型がインターフェイスを宣言していない場合に発生します。

  • CS0539: 明示的なインターフェイス宣言のメンバーが、実装できるインターフェイスのメンバー間で見つかりません
  • CS0540: 型を含む場合、インターフェイス メンバーは実装されません。

これらのエラーは、次の手法を使用して修正できます。

  • 明示的なインターフェイス実装のメンバー名とシグネチャが、インターフェイスで宣言されたメンバーと正確に一致することを確認するか、正しくない実装 (CS0539) を削除します。 明示的なインターフェイスの実装ではインターフェイス コントラクトとの正確な対応が必要なので、実装しようとしているメンバーは、名前、戻り値の型、およびパラメーター型と一致するインターフェイス定義に実際に存在している必要があります。
  • クラスまたは構造体の基本リストにインターフェイスを追加するか、明示的なインターフェイス実装 (CS0540) を削除します。 型は、継承リストで宣言するインターフェイスのメンバーのみを明示的に実装できるため、実装する型は、明示的な実装を提供する前にインターフェイスリレーションシップを確立する必要があります。

詳細については、「 インターフェイス明示的なインターフェイスの実装」を参照してください。

ジェネリック型の制約

型パラメーター制約を使用してジェネリック インターフェイス メソッドを実装すると、次のエラーが発生します。

  • CS0425: メソッドの型パラメーターの制約は、インターフェイス メソッドの型パラメーターの制約と一致する必要があります。代わりに明示的なインターフェイス実装を使用することを検討してください。
  • CS0460: オーバーライドおよび明示的なインターフェイス実装メソッドの制約は基本メソッドから継承されるため、'class' 制約または 'struct' 制約を除き、直接指定することはできません。

これらのエラーは、次の手法を使用して修正できます。

  • 実装メソッドの where 句がインターフェイス メソッドの宣言と同じであるか、制約のセマンティックの意味と一致していることを確認します (CS0425)。 実装の型パラメーター制約は、インターフェイスまたは基本メソッドで定義されているものと一致する必要があります。
  • オーバーライドおよび明示的なインターフェイス実装メソッド (CS0460) から明示的な制約宣言を削除します。 オーバーライド メソッドは、基本メソッドまたはインターフェイス メソッドから制約を自動的に継承するため、再宣言は冗長であり、C# 8 以降で許可されている特定のケースを除き、許可されません。
  • default制約を適用して、C# 9 以降 (CS0460) を使用する場合のオーバーライドおよび明示的なインターフェイス実装で null 許容参照型のあいまいさを解決します。 制約継承規則に対するこの例外により、null 許容注釈コンテキストを明確に区別する既定の制約を明示的に指定できます。
  • C# 8 以降を使用して null 許容参照型注釈 (where T : class) を有効にする場合、オーバーライドおよび明示的なインターフェイス実装メソッドに対して、where T : struct制約または制約を明示的に指定します。 参照型または値型に制約されている型パラメーターに対する null 許容参照型解析をサポートするために、これらの特定の制約が許容されています。

詳細については、型パラメーターの制約インターフェイス、およびNull 許容参照型を参照してください。

メソッドの可視性と修飾子

アクセシビリティまたは修飾子が正しくないインターフェイス メソッドを実装すると、次のエラーが発生します。

  • CS0736: メンバーはインスタンス インターフェイス メンバーを実装しません。インターフェイス メンバーは静的であるため、実装できません。
  • CS0737: メンバーはインターフェイス メンバーを実装しません。インターフェイス メンバーはパブリックではないため、実装できません。

これらのエラーは、次の手法を使用して修正できます。

  • インターフェイス メンバー (static) を実装するメソッド宣言から修飾子を削除します。 C# 10 より前のインターフェイス メンバーはインスタンス メンバーであり、静的メンバーではありません。
  • インターフェイス メンバー (public) を実装するメソッドに アクセス修飾子を追加します。 インターフェイスはパブリック動作のコントラクトを定義するため、すべてのインターフェイス メンバーは暗黙的に public されるため、実装メソッドは、インターフェイス参照を介してアクセスできるパブリック アクセシビリティも必要です。

詳細については、「インターフェイスとアクセス修飾子を参照してください。

アクセサーの実装と競合

可視性の問題や名前付けの競合があるアクセサー メソッドを使用してインターフェイスのプロパティまたはイベントを実装すると、次のエラーが発生します。

  • CS0277: メンバーは、パブリックではないため、インターフェイス メンバーを実装しません。
  • CS0470: メソッドは型のインターフェイス アクセサーを実装できません。明示的なインターフェイスの実装を使用します。
  • CS0686: アクセサーはインターフェイス メンバーを実装できません。明示的なインターフェイスの実装を使用します。

これらのエラーは、次の手法を使用して修正できます。

  • 可視性を publicよりも低い表示に制限するアクセス修飾子をプロパティ アクセサーから削除するか、 public 修飾子がない場合は追加します (CS0277)。 すべてのインターフェイス メンバーは暗黙的に publicされるため、実装アクセサーには、インターフェイス コントラクトを満たし、インターフェイス型を介してアクセスできるようにするためのパブリック アクセシビリティも必要です。
  • メソッドをアクセサーのような名前 (get_PropertyName など) から、明示的なインターフェイス実装 (CS0470) を使用して適切なプロパティ構文に置き換えます。 コンパイラはプロパティのアクセサー メソッドを内部的に生成し、これらの予約名を持つメソッドを手動で作成しようとすると、プロパティ実装メカニズムと競合します。
  • インターフェイスに自動生成されたアクセサー メソッド (CS0686) と一致するメソッド名が含まれている場合、明示的なインターフェイス実装構文を使用して名前の競合を解決します。 コンパイラは、プロパティの get_Propertyset_Property 、イベントの add_Eventremove_Event などのメソッドを自動的に生成するため、インターフェイスでこれらの正確な名前を持つメソッドを宣言する場合は、インターフェイス メソッドとコンパイラによって生成されたアクセサーの間で明確な実装が必要です。

詳細については、「インターフェイス、プロパティ、およびイベント参照してください。

あいまいで競合する実装

次のエラーは、使用するインターフェイス実装をコンパイラが判断できない場合に発生します。

  • CS0473: 明示的なインターフェイス実装 'method name' は、複数のインターフェイス メンバーと一致します。実際に選択されるインターフェイス メンバーは、実装に依存します。代わりに、明示的でない実装を使用することを検討してください。
  • CS8705: インターフェイス メンバー 'member' には最も特定の実装がありません。どちらも最も特定ではありません。

これらのエラーは、次の手法を使用して修正できます。

  • 明示的なインターフェイス実装を排除し、代わりに両方のインターフェイス メソッド (CS0473) に 1 つの暗黙的なパブリック実装を使用します。 ジェネリック メソッドが非ジェネリック メソッドと同じシグネチャを取得する場合 (ITest<int>TestMethod(int)の両方が同じになるTestMethod(T)を実装する場合など)、共通言語インフラストラクチャ メタデータ システムは、どのインターフェイス メンバーがどの実装スロットにバインドするかを明確に判断できないため、暗黙的な実装を使用すると、1 つのメソッドで両方のインターフェイス要件を満たすことができます。
  • 複数の既定の実装 (CS8705) 間のあいまいさを解決する実装クラスまたは構造体に明示的な実装を提供します。 このエラーは通常、ダイヤモンド継承パターンで発生します。このパターンでは、クラスが複数のインターフェイスを実装し、それぞれが同じメンバーの既定の実装を提供します。 コンパイラでは、使用する実装を明示的に指定するか、独自の実装を提供する必要があります。
  • 複数のインターフェイスが同じメンバー (CS8705) の既定の実装を提供する場合に、ダイヤモンド継承の競合を回避するためにインターフェイス階層を再構築します。 インターフェイスの関係を再設計するか、既定の実装を 1 つのインターフェイスに統合することで、コンパイラが最も具体的な実装を決定できないようにするあいまいさを排除できます。

詳細については、「 インターフェイス 」および 「既定のインターフェイス メソッド」を参照してください。

特別な実装の制限

インターフェイスの実装と互換性のない特殊なパラメーター型を使用すると、次のエラーが発生します。

  • CS0630: メンバーには __arglist パラメーターがあるため、インターフェイス メンバーを実装できません。

このエラーは、次の手法を使用して修正できます。

  • 実装メソッド (__arglist) から パラメーターを削除します。 __arglist キーワードを使用すると、メソッドはアンマネージドな方法で可変数の引数を受け入れることができますが、この機能は、コンパイル時に検証できる予測可能なタイプ セーフなシグネチャを必要とするため、インターフェイスの実装と互換性がありません。
  • __arglist パラメーターを可変長引数リストのparams配列パラメーターに置き換えます (CS0630)。 __arglistとは異なり、params キーワードは、インターフェイスの実装と完全に互換性があり、インターフェイスに必要なコンパイル時の型の安全性を維持する、可変個の引数を受け入れるためのタイプ セーフなメカニズムを提供します。

詳細については、Interfacesおよびparams キーワードを参照してください。