我正在尝试编写自己的(简单)List实现。这就是我到目前为止所做的:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace provaIEnum
{
class MyList<T> : IEnumerable<T>
{
private T[] _array;
public int Count { get; private set; }
public MyList() { /* ... */ }
public void Add(T element) { /* ... */ }
// ...
public IEnumerator<T> 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试图告诉我什么,我不知道如何解决它。
感谢您的时间
答案 0 :(得分:45)
由于IEnumerable<T>
实现IEnumerable
,您需要在类中实现此接口,该类具有GetEnumerator方法的非泛型版本。为避免冲突,您可以明确地实现它:
IEnumerator IEnumerable.GetEnumerator()
{
// call the generic version of the method
return this.GetEnumerator();
}
public IEnumerator<T> GetEnumerator()
{
for (int i = 0; i < Count; i++)
yield return _array[i];
}
答案 1 :(得分:35)
更仔细地阅读错误消息;它告诉你你到底要做什么。您没有实施System.Collections.IEnumerable.GetEnumerator
。
实施通用 IEnumerable<T>
时,您还必须实施System.Collections.IEnumerable
的GetEnumerator。
这样做的标准方法是:
public IEnumerator<T> GetEnumerator () { whatever }
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
答案 2 :(得分:10)
您还需要实现非通用的GetEnumerator方法:
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
由于IEnumerable<T>
接口扩展IEnumerable
,您必须实现在两者上声明的方法。
答案 3 :(得分:4)
添加以下方法:
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
答案 4 :(得分:2)
您必须实现两个GetEnumerator()
重载。一个来自IEnumerable<T>
并返回IEnumerator<T>
。另一个来自IEnumerable并返回IEnumerator
。覆盖应如下所示:
IEnumerator IEnumerable.GetEnumerator()
这是因为IEnumerable<T>
实现了IEnumerable
。
答案 5 :(得分:1)
由于您的班级MyList<T>
继承了IEnumerable<out T>
,而IEnumerable
继承了非通用IEnumerator<T> IEnumerable<T>.GetEnumerator()
{
throw new NotImplementedException();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
,因此您需要实施两种方法:
class MyList<T> : IEnumerable<T>
一种简单的方法是在宣布你的课时:
IEnumerable<T>
右键点击{{1}}文字,然后选择实施界面&gt;从上下文菜单中显示实现接口。
答案 6 :(得分:1)
我遇到了类似的问题,虽然我也实现了IEnumerable和IEnumerable。我使用的是自定义类型(Person类)而不是泛型类型T. 对我来说原因是,命名空间不包含在文件顶部。
using System.Collections;
添加命名空间后,对我来说没问题。