实现 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<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>文本,然后从上下文菜单中选择"实现接口>显式实现接口"。