当我实现IEnumerable时,为什么我不能得到Current的值?

Roy*_*bot 4 .net c# ienumerable

我做了以下工作

class Program
{
    class GenEnumerator<T> : IEnumerable
    {
        public T[] Values { get; set; }


        public IEnumerator GetEnumerator()
        {
            for (int i = 0; i < Values.Length; i++)
                yield return Values[i];
        }
    }

    static void Main(string[] args)
    {
        GenEnumerator<string> g = new GenEnumerator<string>();
        g.Values = new string[] { "a", "b", "c", "d", "e" };
        g.GetEnumerator().MoveNext();

        Console.WriteLine(g.GetEnumerator().Current);


        Console.ReadKey();
    }
}
Run Code Online (Sandbox Code Playgroud)

g.GetEnumerator().Current永远是空的.
但如果我这样做 - var a = g.GetEnumerator();
当前的proeperty得到一个值,并且工作正常

IEnumerator如果我想在Current没有IEnumerator类型变量的情况下使用它是否意味着我必须显式继承该类并实现其方法和属性?

谢谢,罗伊

Sri*_*vel 7

您正在创建的新实例,GenEnumerator通过调用每次GetEnumerator,这就是为什么你Currentnull.而是将其存储在一个字段中并使用它.

var e = g.GetEnumerator();
if(e.MoveNext())
{
    var current = e.Current;
}
Run Code Online (Sandbox Code Playgroud)


das*_*ght 6

这是因为为了Current使其变为非null,您需要调用MoveNext()同一个对象.

您当前的代码调用MoveNext()临时对象.这是你打电话时发生的事情

g.GetEnumerator().MoveNext()`;
Console.WriteLine(g.GetEnumerator().Current);
Run Code Online (Sandbox Code Playgroud)
  • 调用GetEnumerator()返回一个对象x
  • 呼叫x.MoveNext()进行
  • x 有资格进行垃圾收集,因为它不会从程序中的任何变量引用.
  • 当您调用时g.GetEnumerator().Current,将y返回一个新对象
  • 发出一个调用y.Current,返回null,因为没有调用MoveNexton对象y

a但是,当您添加变量时,您调用MoveNextCurrent在同一个对象上修复问题:

  • 调用GetEnumerator()返回一个对象x,该对象被赋值给变量a
  • 呼叫a.MoveNext()进行
  • 呼叫a.Current进行