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

MyN*_*Job 8 .net c# interface list

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

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

另外,为什么GetEnumerator只有返回类型才能将两个版本都作为方法存在?这似乎违背了C#中的规则,指定重载方法不能返回类型而不同.

que*_*rin 12

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

IEnumerator来自.Net v1.1,在引入泛型类型之前. IEnumerator<T>是.Net v2中添加的通用类型版本.

"旧"版本IEnumerator已保留兼容性,因此现在IList<T>实现两者.

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

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


Jus*_*ner 8

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

public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable
Run Code Online (Sandbox Code Playgroud)

而且由于显式接口实现,它们都能够存在.