当我实施IList<T>
时,我发现我需要定义两个 GetEnumerator
方法。一个返回类型为IEnumerator
的值,而另一个返回IEnumerator<T>
。
我对这两种GetEnumerator
方法之间的区别感到有些困惑。虽然返回类型明显不同,但它们基本上不包含相同的数据吗?
此外,为什么GetEnumerator
的两个版本只能通过返回类型区分时才能作为方法存在?这似乎违反了C#中的规则,该规则指定重载方法不能仅因返回类型而不同。
答案 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)
是的,两种方法都应该返回相同的数据。
它们可以共存,因为它们是两个不同界面IEnumerable
和IEnumerable<T>
的一部分。
答案 3 :(得分:1)
它们都可以存在,因为其中一个将被实现explicitly:
IEnumerator IEnumerable.GetEnumerator()
{
}
如果您尝试将它们隐式定义,则会出现编译错误。
是的,他们都应该返回相同的数据。
您需要定义GetEnumerator
的两个版本,以便同时满足从IEnumerable
派生的接口(IEnumerable<T>
和IList<T>
)。但是,在实践中,您往往会发现GetEnumerator
的非泛型版本在大多数实现中只调用泛型版本。
答案 4 :(得分:0)
IList<T>
实现IEnumerable<T>
和IEnumerable
。 GetEnumerator
的不同实现来自每个接口。两者都应该返回相同的数据。
答案 5 :(得分:0)
IEnumerator枚举对象,而IEnumerator枚举T.对于第二个问题,第二个函数是完全限定的:
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
}
VS
public IEnumerator<T> GetEnumerator()
{
}