实现IEnumerable 的麻烦
我正在尝试编写自己的(简单)List实现。 这是我到目前为止所做的:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace provaIEnum { class MyList : IEnumerable { private T[] _array; public int Count { get; private set; } public MyList() { /* ... */ } public void Add(T element) { /* ... */ } // ... public IEnumerator GetEnumerator() { for (int i = 0; i < Count; i++) yield return _array[i]; } }
我收到一个关于GetEnumerator的错误:
‘provaIEnum.Lista’没有实现接口成员’System.Collections.IEnumerable.GetEnumerator()’。 ‘provaIEnum.Lista.GetEnumerator()’无法实现’System.Collections.IEnumerable.GetEnumerator()’,因为它没有匹配的返回类型’System.Collections.IEnumerator’。
我不确定我是否理解VS试图告诉我什么,我不知道如何解决它。
谢谢你的时间
由于IEnumerable
实现了IEnumerable
您需要在具有GetEnumerator方法的非generics版本的类中实现此接口。 为避免冲突,您可以明确地实现它:
IEnumerator IEnumerable.GetEnumerator() { // call the generic version of the method return this.GetEnumerator(); } public IEnumerator GetEnumerator() { for (int i = 0; i < Count; i++) yield return _array[i]; }
请仔细阅读错误消息; 它告诉你你到底要做什么。 您没有实现System.Collections.IEnumerable.GetEnumerator
。
实现通用 IEnumerable
时,还必须实现System.Collections.IEnumerable
的GetEnumerator。
这样做的标准方法是:
public IEnumerator GetEnumerator () { whatever } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return this.GetEnumerator(); }
您还需要实现非generics的GetEnumerator方法:
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
由于IEnumerable
接口扩展了IEnumerable
,因此必须实现在两者上声明的方法。
添加以下方法:
IEnumerator IEnumerable.GetEnumerator() { return this.GetEnumerator(); }
您必须实现两个GetEnumerator()
重载。 一个来自IEnumerable
并返回IEnumerator
。 另一个来自IEnumerable并返回IEnumerator
。 覆盖应如下所示:
IEnumerator IEnumerable.GetEnumerator()
这是因为IEnumerable
实现了IEnumerable
。
由于您的类MyList
inheritance了IEnumerable
,而IEnumerable
inheritance了非通用IEnumerable
,因此您需要实现两种方法:
IEnumerator IEnumerable .GetEnumerator() { throw new NotImplementedException(); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { throw new NotImplementedException(); }
一个简单的方法是在你宣布你的课时:
class MyList : IEnumerable
右键单击IEnumerable
文本, 然后从上下文菜单中选择实现接口>实现接口显式 。
我遇到了类似的问题,虽然我也实现了IEnumerable和IEnumerable。 我使用自定义类型(Person类)而不是generics类型T.对我来说原因是,命名空间不包含在文件顶部。
using System.Collections;
添加命名空间后,对我来说很好。