实现 IEnumerable 的麻烦
本文关键字:麻烦 IEnumerable 实现 | 更新日期: 2023-09-27 18:19:34
我正在尝试编写自己的(简单(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 试图告诉我的内容,我不知道如何解决它。
感谢您抽出宝贵时间
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];
}
更仔细地阅读错误消息;它准确地告诉你你必须做什么。您没有实施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();
}
您还需要实现非泛型 GetEnumerator 方法:
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
由于IEnumerable<T>
接口扩展IEnumerable
,你必须实现在两者上声明的方法。
我遇到了类似的问题,尽管我也实现了IEnumerable和IEnumerable。我使用的是自定义类型(人员类(而不是通用类型 T。对我来说,原因是命名空间不包含在文件顶部。
using System.Collections;
添加命名空间后,对我来说很好。
添加以下方法:
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
您必须实现两个重载GetEnumerator()
。一个来自IEnumerable<T>
,返回IEnumerator<T>
。另一个来自 IEnumerable 并返回 IEnumerator
。覆盖应如下所示:
IEnumerator IEnumerable.GetEnumerator()
这是因为IEnumerable<T>
实现了IEnumerable
。
由于你的类,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>
文本,然后从上下文菜单中选择"实现接口>显式实现接口"。