2つのメソッドが同じ名前であるが、戻り値の型が異なる場合。それらは2つのインタフェースからのクラスによって継承されます。このクラスは、インプリメンテーションの戻り値の型が両方のインタフェースの戻り値の型に一致する場合、両方に対して1つのインプリメンテーションを提供できます。2つの異なるインターフェイスで2つのメソッドに同じ名前がありますが、実装が1つではありませんか?
たとえば、String
タイプは、両方のメソッド:IEnumerable
とIEnumerable<char>
を実装します。 String
タイプの実装には、GetEnumerator
の実装が1つだけ含まれています。
interface Ia { IEnumerator o();}
interface Ib { IEnumerator<int> o();}
class e : IEnumerator, IEnumerator<int>{}
class c : Ia, Ib { public e o() { return new e(); } }
、しかし、以下の私のアプリケーションで同様のコードは私にコンパイルエラーを与えるCharEnumerator
は両方IEnumerator
とIEnumerator<char>
public CharEnumerator: IEnumerator, IEnumerator<char>
を実装しているため、これは可能であると考えてい
public CharEnumerator GetEnumerator();
Visual StudioでString型のF12を実行すると、次のようなものが表示されます。 あなたが見ることができるように
、暗黙のうちにがIEnumerable
またはIEnumerable<char>
を実装していませんGetEnumerator()
の唯一の1暗黙の実装、そこ
:
そして今、あなたは次の動作を取得します。これは、Stringクラスが* 2 * GetEnumerator()メソッドを持っている理由です。 2番目の方法は、あいまいさを避けるために必要な明示的な実装方法です。なぜ2つも必要なのです。 –
@ HansPassant私は両方の*インターフェースが明示的に実装されていると思います。 'string.GetEnumerator'は実際には2つのインタフェース規約のいずれにも準拠しない' CharEnumerator'を返します。私はこれがC#1のレガシーコードだと推測しています – InBetween
@HansPassantなぜコードがコンパイルに失敗しますか? 'e'型は 'IEnumerable'と' IEnumerable <> 'から派生します – EagerToLearn