次の方法で共有


静的抽象および仮想インターフェイス メンバーのエラーと警告

インターフェイス内の静的抽象メンバーまたは仮想メンバーの無効な宣言に対して、コンパイラによって次のエラーが生成されます。

  • CS8920: インターフェイスを型引数として使用することはできません。静的メンバーには、インターフェイスに最も具体的な実装がありません。
  • CS8921: 単項演算子のパラメーターは、包含型であるか、その型パラメーターに制約されている必要があります。
  • CS8922: ++演算子または--演算子のパラメーター型は、包含型であるか、その型パラメーターに制約されている必要があります。
  • CS8923: ++演算子または--演算子の戻り値の型は、パラメーター型と一致するか、パラメーター型から派生するか、パラメーター型が異なる型パラメーターでない限り、それに制約された包含型の型パラメーターである必要があります。
  • CS8924: 二項演算子のパラメーターの 1 つは、包含型であるか、その型パラメーターに制約されている必要があります。
  • CS8925: オーバーロードされたシフト演算子の最初のオペランドは、含む型またはその型パラメーターと同じ型を持つ必要があります
  • CS8926: 静的仮想または抽象インターフェイス メンバーには、型パラメーターでのみアクセスできます。
  • CS8928: 型は静的インターフェイス メンバーを実装しません。メソッドは静的ではないため、インターフェイス メンバーを実装できません。
  • CS8930: ユーザー定義演算子の明示的な実装を静的として宣言する必要がある
  • CS8931: インターフェイス内でのユーザー定義変換は、外側の型に制約された外側の型の型パラメーターへの変換またはそこからの変換でなければなりません
  • CS8932: 'UnmanagedCallersOnly' メソッドは型のインターフェイス メンバーを実装できません
  • CS9044: 型はインターフェイス メンバーを実装しません。メソッドは、アクセスできないメンバーを暗黙的に実装できません。
  • CS9046: インターフェイスで宣言される等値演算子または不等値演算子のパラメーターの 1 つは、インターフェイスに制約された型パラメーターである必要があります

これらのエラーは、コード内の 3 つの場所で発生します。

インターフェイス宣言のエラー

static abstract または static virtual メンバーを使用してインターフェイスを宣言すると、次のエラーが発生する可能性があります。

  • CS8921: 単項演算子のパラメーターは、包含型であるか、その型パラメーターに制約されている必要があります。
  • CS8922: ++演算子または--演算子のパラメーター型は、包含型であるか、その型パラメーターに制約されている必要があります。
  • CS8923: ++演算子または--演算子の戻り値の型は、パラメーター型と一致するか、パラメーター型から派生するか、パラメーター型が異なる型パラメーターでない限り、それに制約された包含型の型パラメーターである必要があります。
  • CS8924: 二項演算子のパラメーターの 1 つは、包含型であるか、その型パラメーターに制約されている必要があります。
  • CS8925: オーバーロードされたシフト演算子の最初のオペランドは、含む型と同じ型または、その型パラメーターによって制約された型を持つ必要があります
  • CS8931: インターフェイス内のユーザー定義変換は、外側の型に制約された外側の型の型パラメーターに対して、またはそこから変換する必要があります。
  • CS9046: インターフェイスで宣言された等値演算子または不等値演算子のパラメーターの 1 つは、インターフェイスに制約された型パラメーターである必要があります

インターフェイスで宣言された単項演算子の場合は、パラメーターがインターフェイスの型自体であるか、Tがインターフェイスを実装するように制約されているT型パラメーター (CS8921) であることを確認します。 この制約により、インターフェイスを実装する型にのみ演算子を適用できるため、コンパイラはコンパイル時に正しい実装を解決できます。

インクリメント (++) 演算子とデクリメント (--) 演算子の場合は、パラメーターが他の単項演算子 (CS8922) と同じ規則に従っていることを確認します。 さらに、戻り値の型は、パラメーター型と一致するか、そこから派生するか、インターフェイスに制約されたインターフェイスの型パラメーターである必要があります (CS8923)。 これらの規則により、インクリメント操作とデクリメント操作で、元の変数に割り当てることができる互換性のある型が返されることが保証されます。

二項演算子の場合、2 つのパラメーターのうち少なくとも 1 つは、インターフェイスを実装するために制約された包含インターフェイス型または型パラメーターである必要があります (CS8924)。 この要件により、他のパラメーターを任意の型にすることができ、一般的な数学シナリオで T operator +(T left, int right) などの演算子が有効になります。

シフト演算子 (<< および >>) の場合、最初のオペランドは、包含型またはその制約付き型パラメーター (CS8925) である必要があります。 2 番目のオペランドは標準のシフト演算子ルールに従い、通常は int

ユーザー定義変換演算子の場合、変換には、外側のインターフェイス型 (CS8931) に制約される型パラメーターが含まれている必要があります。 インターフェイスで任意の型間の変換を定義することはできません。変換は、インターフェイスを実装する型に関連している必要があります。

等値 (==) 演算子と不等値 (!=) 演算子の場合、インターフェイス型自体 (CS9046) だけでなく、少なくとも 1 つのパラメーターがインターフェイスに制約された型パラメーターである必要があります。 等値演算子に対するこのより厳しい要件により、インターフェイスを介してインスタンスを比較するときに適切な型の安全性が保証されます。

インターフェイスでの演算子宣言の規則の詳細については、インターフェイスの 静的抽象メンバーを参照してください。 これらのパターンを実装するための実用的なガイドについては、「 静的抽象インターフェイス メンバーの探索」を参照してください。

インターフェース宣言を実装する型におけるエラー

static abstractメソッドまたはstatic virtualメソッドを使用してインターフェイスを実装する型を定義すると、次のエラーが発生することがあります。

  • CS8928: 型は静的インターフェイス メンバーを実装しません。メソッドは静的ではないため、インターフェイス メンバーを実装できません。
  • CS8930: ユーザー定義演算子の明示的な実装を静的として宣言する必要がある
  • CS8932: 'UnmanagedCallersOnly' メソッドは型のインターフェイス メンバーを実装できません
  • CS9044: 型はインターフェイス メンバーを実装しません。メソッドは、アクセスできないメンバーを暗黙的に実装できません。

静的抽象または静的仮想インターフェイス メンバーを実装する場合は、 static 修飾子 (CS8928) を使用して実装メソッドを宣言します。 インスタンス メソッドによって実装されるインスタンス インターフェイス メンバーとは異なり、静的抽象メンバーは、インスタンスではなく型自体で呼び出されるため、静的実装が必要です。

インターフェイスからユーザー定義演算子を明示的に実装する場合は、実装に static 修飾子を含めます (CS8930)。 演算子の明示的なインターフェイス実装は、暗黙的な実装と同じ静的要件に従います。

インターフェイス メンバー (System.Runtime.InteropServices.UnmanagedCallersOnlyAttribute) を実装するすべてのメソッドから属性を削除します。 この属性を使用してマークされたメソッドは、アンマネージ コードからのみ呼び出すことができます。ランタイムはインターフェイス ディスパッチ メカニズムを介して呼び出す必要があるため、インターフェイスの実装に参加できません。

実装メソッドのアクセシビリティがインターフェイス メンバーよりも制限の厳しい場合 (たとえば、private インターフェイス メンバーを実装するinternalまたはpublic メソッド)、暗黙的な実装ではなく明示的なインターフェイス実装構文を使用します (CS9044)。 暗黙的な実装では、実装するメンバーは、少なくとも実装するインターフェイス メンバーと同じくらいアクセス可能である必要があります。

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

静的抽象インターフェイス メンバーを呼び出すエラー

インターフェイスの static abstract または static virtual メンバーとして定義されたメンバーを呼び出そうとすると、次のエラーが表示されることがあります。

  • CS8920: インターフェイスを型引数として使用することはできません。静的メンバーには、インターフェイスに最も具体的な実装がありません。
  • CS8926: 静的仮想または抽象インターフェイス メンバーには、型パラメーターでのみアクセスできます。

静的抽象メンバーを持つインターフェイスを型引数として使用する場合は、すべての静的抽象メンバーが使用可能な最も具体的な実装 (CS8920) を持っていることを確認します。 このエラーは、コンパイラが使用する実装を決定できない場合に表示されます。通常、複数のインターフェイス階層で既定の実装が競合しているか、実装が存在しないためです。

インターフェイス型を直接使用するのではなく、インターフェイスを実装するように制約されている型パラメーター (CS8926) を介して静的抽象または静的仮想インターフェイス メンバーにアクセスします。 たとえば、T.MemberNameではなく、Twhere T : IMyInterfaceによって制約されているIMyInterface.MemberNameを使用します。 コンパイラは、呼び出す実装を解決するために具象型を必要とし、制約付き型パラメーターは、コンパイル時にその具象型をジェネリック特殊化によって提供します。

静的抽象メンバーへのアクセスの詳細については、 インターフェイスの静的抽象メンバーを参照してください。