IEnumerableを 2つのGetEnumeratorメソッドのメソッドを提供します - それらの間の違いは何ですか?

StackOverflow https://stackoverflow.com/questions/560678

  •  05-09-2019
  •  | 
  •  

質問

IEnumerable<T>や他のGetEnumeratorを返す1:私はIEnumeratorインタフェースをemplementすると

私は2つのIEnumerator<T>方法を参照してください。ときに私は1つまたは別のものを使うのでしょうか?

役に立ちましたか?

解決

あなたはIEnumerable<T>汎用的なインタフェースを実装している場合、あなたはほとんど常にジェネリックGetEnumeratorメソッドを使用する必要があります - 。あなたは(非ジェネリック)のIEnumerableに明示的にオブジェクトをキャストしない限り、

その理由は後方ジェネリックをサポートしていませんでした.NET 1.0 / 1.1との互換性です。

他のヒント

あなたは、通常の両方を実装しています。一つは、タイプセーフな列挙子(IEnumerator<T>)を返し、新しい、ジェネリック版です。他の一つはレガシーコード(返品IEnumerator)との互換性のためです。典型的な実装があります:

public IEnumerator<T> GetEnumerator() {
    foreach(T item in items) {
        yield return item;
    }
}

IEnumerator IEnumerable.GetEnumerator() {
    return GetEnumerator();
}
あなたはIEnumerable<T>IEnumerableから非ジェネリックメソッドからジェネリックメソッドを見ているようIEnumerable<T>IEnumerableインターフェイスを継承するため、

二つの方法がある理由があります。

ここでは、あなたがあなたのタイプのインターフェイスを実装する方法です。

class Foo : IEnumerable<Foo>
{
    public IEnumerator<Foo> GetEnumerator()   
    {
        // do your thing here
    }

    // do a EIMI here and simply call the generic method
    IEnumerator IEnumerable.GetEnumerator()
    {
        this.GetEnumerator();
    }
}

は、通常GetEnumerator()GetEnumerator<T>()呼び出して、その行動に大きな差があってはなりません。二つの方法がある理由については、これは後方互換性のためとTが大きな関心ではない(あるいは単に不明である)状況で使用するために行われます。

1は、他の1つの汎用ではありません。私は、コンパイラは、一般的なオーバーロードを使用することを好むと考えています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top