2016-05-09 4 views
6

IEnumerable & IEnumeratorをトレーニング中に書いていたクラスに実装すると、「Current」というプロパティの2つの実装を指定する必要があることに気付きました。IEnumerator <T> .Current&IEnumerator.Currentを定義する必要があるのはなぜですか?

public class PeopleEnumerator : IEnumerator<Person> 
{ 
    People people; // my collection I'm enumerating (just a wrapped array). 
    int index; // my index to keep track of where in the collection I am. 

    ... 

    //implementation for Person 
    public Person Current { get { return people[index]; } } 

    //implementation for object 
    object Enumerator.Current { get { return people[index]; } } 
} 

私は大体、私はIEnumeratorをいくつかの非ジェネリックバージョンと、そのための「現在」プロパティを実装しています、しかし、私は次のことを理解していないことを理解:

  • を私はなぜここで戻り値の型でオーバーロードすることができますか?おそらく、それは明示的なIEnumerator.Currentと関係があります。しかし、理由は私には不透明です。
  • なぜ "object IEnumerator.Current"を "public"として指定できないのですか?

ありがとうございます!

答えて

7

2つの異なるインターフェイスを実装する必要がある理由は1つだけです:下位互換性。 C#1.0にはジェネリックはありませんでした。
C#2.0では、IEnumerator<T>が1.0 IEnumeratorに拡張されています。

  • なぜ私はここで戻り値の型でオーバーロードすることができますか?おそらく、それは明示的なIEnumerator.Currentと関係があります。しかし、理由は私には不透明です。

あなただけ戻り値の型によってできない過負荷メソッドやプロパティ。その理由の1つが明示的な実装でなければなりません。

  • なぜ "オブジェクトがIEnumerator.Current" "公共" として指定することはできませんか?

同じ理由です。これは明示的な実装でなければなりません。明示的な実装では、可視性修飾子をルールとして使用することはできません。おそらく他の可視性を持つことはできません。 IEnumerator.Currentは、IEnumeratorインターフェイスのインスタンスを通じてのみ呼び出すことができます。

+0

これは、問題についての私の疑惑をたくさん確認してくれた、ありがとう!プロパティ/メソッドの明示的な定義については少し混乱していますが、何が起きているのかを実際に理解するにはMSILを調べなければならないかもしれません。 –

関連する問題