IEnumerableを 2つのGetEnumeratorメソッドのメソッドを提供します - それらの間の違いは何ですか?
-
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つの汎用ではありません。私は、コンパイラは、一般的なオーバーロードを使用することを好むと考えています。
所属していません StackOverflow