2

を実装する単純なコレクション クラスを作成していますICollection<T>IEnumerator<T> GetEnumerator()メソッドを追加すると、メソッドがないと不平を言う場合を除いて、すべてが基本的に機能しIEnumerator GetEnumerator()ます。およびその逆。戻り値の型だけが異なるため、両方を持つことは許可されていません。そのため、コンパイラが私に何を求めているのかについて、私は本当にかなり混乱しています。

以下は、私に与えられた正確なエラーです。

エラー CS0738: MyClass<T>' does not implement interface memberSystem.Collections.Generic.IEnumerable.GetEnumerator()' および最適な実装候補MyClass<T>.GetEnumerator()' return typeSystem.Collections.IEnumerator' がインターフェイス メンバーの戻り値の型 `System.Collections.Generic.IEnumerator' と一致しません

または、代わりに次のものを使用できます。

エラー CS0738: MyClass<T>' does not implement interface memberSystem.Collections.IEnumerable.GetEnumerator()' および最適な実装候補MyClass<T>.GetEnumerator()' return typeSystem.Collections.Generic.IEnumerator' がインターフェイス メンバーの戻り値の型 `System.Collections.IEnumerator' と一致しません

4

3 に答える 3

6

それらを明示的に実装します。

IEnumerator IEnumerable.GetEnumerator() {
}

IEnumerator<T> IEnumerable<T>.GetEnumerator() {
}

// etc.

明示的なインターフェイスの実装は、これを実現する方法です。MSDN でそれについて読んでください: http://msdn.microsoft.com/en-us/library/aa288461(v=vs.71).aspx

于 2013-10-17T03:35:02.697 に答える
3

明示的なインターフェイスの実装を使用します。それはまさに と の両方をList<T>実装する方法であり、3 番目の方法を指しています。IEnumerableIEnumerable<T>GetEnumerator

IEnumerator IEnumerable.GetEnumerator()
{
    return new List<T>.Enumerator(this);
}

IEnumerator<T> IEnumerable<T>.GetEnumerator()
{
    return new List<T>.Enumerator(this);
}

public List<T>.Enumerator GetEnumerator()
{
    return new List<T>.Enumerator(this);
}

この種の宣言を使用すると、いくつかのインターフェイス メソッドを実装している限り、同じ名前のメソッドを複数持つことができます。

于 2013-10-17T03:33:35.783 に答える
-3

ICollection は IEnumerable を拡張します。したがって、クラスで IEnumerable を実行したくない

http://msdn.microsoft.com/en-us/library/92t2ye13.aspx

于 2013-10-17T03:33:35.737 に答える