繁体   English   中英

实现IEnumerable的麻烦<T>

[英]Troubles implementing IEnumerable<T>

我正在尝试编写自己的(简单)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 ,因此必须实现在两者上声明的方法。

添加以下方法:

IEnumerator IEnumerable.GetEnumerator()
{
    return this.GetEnumerator();
}

您必须实现两个GetEnumerator()重载。 一个来自IEnumerable<T>并返回IEnumerator<T> 另一个来自IEnumerable并返回IEnumerator 覆盖应如下所示:

IEnumerator IEnumerable.GetEnumerator()

这是因为IEnumerable<T>实现了IEnumerable

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

using System.Collections; 

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

由于您的类MyList<T>继承了IEnumerable<out T> ,而IEnumerable继承了非通用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>文本, 然后从上下文菜单中选择实现接口>实现接口显示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM