为什么实现'IList <t>'需要定义两个'GetEnumerator'方法?</t>

时间:2010-12-10 16:38:23

标签: c# .net list interface

当我实施IList<T>时,我发现我需要定义两个 GetEnumerator方法。一个返回类型为IEnumerator的值,而另一个返回IEnumerator<T>

我对这两种GetEnumerator方法之间的区别感到有些困惑。虽然返回类型明显不同,但它们基本上不包含相同的数据吗?

此外,为什么GetEnumerator的两个版本只能通过返回类型区分时才能作为方法存在?这似乎违反了C#中的规则,该规则指定重载方法不能仅因返回类型而不同。

6 个答案:

答案 0 :(得分:11)

两者都应该返回相同的数据,是的。

在引入泛型类型之前,

IEnumerator来自.Net v1.1。 IEnumerator<T>是.Net v2中添加的通用类型版本。

保留了“旧”版本IEnumerator以保持兼容性,因此现在IList<T>实现了这两个版本。

两者之间的区别在于非泛型IEnumerator返回对象,而泛型IEnumerator<T>返回T'。虽然,c#编译器会为你插入一个强制转换,以便在foreach中使用时使非泛型IEnumerator 看起来像强类型。

泛型类型参数的存在足以让编译器区分这两个接口,但是要实现这两个接口,必须明确实现它们。

答案 1 :(得分:8)

这两个来自IList自己实现的独立接口,这就是为什么你必须实现两者:

public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable

由于Explicit Interface Implementation,他们都能够存在。

答案 2 :(得分:4)

是的,两种方法都应该返回相同的数据。

它们可以共存,因为它们是两个不同界面IEnumerableIEnumerable<T>的一部分。

答案 3 :(得分:1)

它们都可以存在,因为其中一个将被实现explicitly

IEnumerator IEnumerable.GetEnumerator()
{

}

如果您尝试将它们隐式定义,则会出现编译错误。

是的,他们都应该返回相同的数据。

您需要定义GetEnumerator的两个版本,以便同时满足从IEnumerable派生的接口(IEnumerable<T>IList<T>)。但是,在实践中,您往往会发现GetEnumerator的非泛型版本在大多数实现中只调用泛型版本。

答案 4 :(得分:0)

IList<T>实现IEnumerable<T>IEnumerableGetEnumerator的不同实现来自每个接口。两者都应该返回相同的数据。

答案 5 :(得分:0)

IEnumerator枚举对象,而IEnumerator枚举T.对于第二个问题,第二个函数是完全限定的:

  System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()  
  {

  }

VS

public IEnumerator<T> GetEnumerator()
    {

    }