为什么我必须定义IEnumerator <t> .Current&amp; IEnumerator.Current,它实现了什么?

时间:2016-05-09 19:49:13

标签: c#

实施IEnumerable&amp;我在培训期间写的一个班级的IEnumerator,我注意到我需要为该属性指定两个实现&#34; Current&#34;。

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和一个&#34; Current&#34;它的财产,但我不明白以下事项:

  • 为什么我可以通过返回类型在这里超载?据推测它与显式的IEnumerator.Current有关;但是原因对我来说是不透明的。
  • 为什么&#34;对象IEnumerator.Current&#34;不被指定为&#34; public&#34;?

提前致谢!

1 个答案:

答案 0 :(得分:7)

您必须实现两个不同的接口只有一个原因:向后兼容性。 C#1.0没有泛型 在C#2.0中,我们得到IEnumerator<T>,扩展了1.0 IEnumerator

  
      
  • 为什么我可以通过返回类型在这里超载?据推测它与显式的IEnumerator.Current有关;但是原因对我来说是不透明的。
  •   

不能仅按返回类型重载方法或属性;这就是为什么其中一个必须是一个明确的实现。

  
      
  • 为什么“对象IEnumerator.Current”不能被指定为“public”?
  •   

同样的道理。它必须是一个明确的实现。显式实现不能将可见性修饰符作为规则。它不可能有任何其他可见性。 IEnumerator.Current只能通过IEnumerator接口的实例调用。