实现IEnumerable <T>的麻烦

Bla*_*ear 29 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];
        }
    }
Run Code Online (Sandbox Code Playgroud)

我收到一个关于GetEnumerator的错误:

'provaIEnum.Lista'没有实现接口成员'System.Collections.IEnumerable.GetEnumerator()'.'provaIEnum.Lista.GetEnumerator()'无法实现'System.Collections.IEnumerable.GetEnumerator()',因为它没有匹配的返回类型'System.Collections.IEnumerator'.

我不确定我是否理解VS试图告诉我什么,我不知道如何解决它.

谢谢你的时间

Dar*_*rov 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];
}
Run Code Online (Sandbox Code Playgroud)

  • 既然你没有使用`System.Collections.'显式限定`IEnumerator`和`IEnumerable.GetEnumerator`,如果你没有`using System.Collections`就会失败,说(非常无益)`IEnumerator`需要一个泛型说法! (7认同)

Eri*_*ert 35

请仔细阅读错误消息; 它告诉你你到底要做什么.你没有实现System.Collections.IEnumerable.GetEnumerator.

实现泛型 IEnumerable<T>时,还必须实现System.Collections.IEnumerableGetEnumerator.

这样做的标准方法是:

public IEnumerator<T> GetEnumerator () { whatever }
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
    return this.GetEnumerator();
}
Run Code Online (Sandbox Code Playgroud)


Ric*_*lly 10

您还需要实现非通用的GetEnumerator方法:

IEnumerator IEnumerable.GetEnumerator()
{
    return GetEnumerator();
}
Run Code Online (Sandbox Code Playgroud)

由于IEnumerable<T>接口扩展IEnumerable,您必须实现在两者上声明的方法.


Rot*_*eel 6

我遇到了类似的问题,尽管我也实现了 IEnumerable 和 IEnumerable。我使用的是自定义类型(Person 类)而不是通用类型 T。对我来说,原因是命名空间未包含在文件顶部。

using System.Collections; 
Run Code Online (Sandbox Code Playgroud)

添加名称空间后,这对我来说很好。