相关疑难解决方法(0)

实现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];
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢你的时间

c#

29
推荐指数
4
解决办法
2万
查看次数

如果我可以定义一个GetEnumerator,为什么要实现IEnumerable(T)?

更新:我感谢所有的评论,这些评论基本上都是一致的反对意见.虽然提出的每一项反对意见都是有效的,但我觉得棺材中的最终指甲是Ani的精明观察,最终,即使是这个想法表面上提供的一个 微不足道的好处 - 消除样板代码 - 也被这个事实所否定.想法本身需要自己的样板代码.

所以,是的,请相信我说:这将是一个坏主意.

而且只是为了有点挽救我的尊严:我可能是出于争吵的缘故而玩弄它,但我从来没有真正把这个想法卖掉 - 只是好奇地听到别人不得不说的话.诚实.


在你将这个问题视为荒谬之前,我请你考虑以下问题:

  1. IEnumerable<T>从继承*IEnumerable,这意味着实现任何类型的IEnumerable<T>通常必须实现两个 IEnumerable<T>.GetEnumerator (明确地)IEnumerable.GetEnumerator.这基本上等于样板代码.
  2. 只要该方法使用方法和属性返回某种类型的对象,就可以foreach覆盖任何具有GetEnumerator方法的类型.因此,如果您的类型使用签名定义了一个方法,那么使用它来枚举它是合法的.MoveNextCurrentpublic IEnumerator<T> GetEnumerator()foreach
  3. 显然,有很多代码需要IEnumerable<T>接口 - 例如,基本上所有的LINQ扩展方法.幸运的是,使用C#通过关键字提供的自动迭代器生成,从可以使用的类型foreach转变IEnumerable<T>为简单的类型yield.

所以,把这一切放在一起,我有这个疯狂的想法:如果我只是定义我自己的界面,如下所示:

public interface IForEachable<T>
{
    IEnumerator<T> GetEnumerator();
}
Run Code Online (Sandbox Code Playgroud)

然后每当我定义一个我想要枚举的类型时,我实现这个接口而不是IEnumerable<T>,不需要实现两个GetEnumerator方法(一个显式).例如:

class NaturalNumbers : IForEachable<int>
{
   public IEnumerator<int> GetEnumerator()
   {
       int …
Run Code Online (Sandbox Code Playgroud)

.net c# ienumerable ienumerator foreach

13
推荐指数
4
解决办法
3070
查看次数

标签 统计

c# ×2

.net ×1

foreach ×1

ienumerable ×1

ienumerator ×1