我正在尝试编写自己的(简单)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试图告诉我什么,我不知道如何解决它.
谢谢你的时间
更新:我感谢所有的评论,这些评论基本上都是一致的反对意见.虽然提出的每一项反对意见都是有效的,但我觉得棺材中的最终指甲是Ani的精明观察,最终,即使是这个想法表面上提供的一个 微不足道的好处 - 消除样板代码 - 也被这个事实所否定.想法本身需要自己的样板代码.
所以,是的,请相信我说:这将是一个坏主意.
而且只是为了有点挽救我的尊严:我可能是出于争吵的缘故而玩弄它,但我从来没有真正把这个想法卖掉 - 只是好奇地听到别人不得不说的话.诚实.
在你将这个问题视为荒谬之前,我请你考虑以下问题:
IEnumerable<T>从继承*IEnumerable,这意味着实现任何类型的IEnumerable<T>通常必须实现两个 IEnumerable<T>.GetEnumerator 和(明确地)IEnumerable.GetEnumerator.这基本上等于样板代码.foreach覆盖任何具有GetEnumerator方法的类型.因此,如果您的类型使用签名定义了一个方法,那么使用它来枚举它是合法的.MoveNextCurrentpublic IEnumerator<T> GetEnumerator()foreachIEnumerable<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)