实现IEnumerable <t> </t>的麻烦

时间:2012-01-06 15:38:14

标签: c#

我正在尝试编写自己的(简单)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试图告诉我什么,我不知道如何解决它。

感谢您的时间

7 个答案:

答案 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; 

添加命名空间后,对我来说没问题。