2014-01-08 92 views
4

我做了以下工作爲什麼我無法獲得當前值當我實現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(); 
    } 
} 

g.GetEnumerator().Current總是空。
但如果我這樣做 - var a = g.GetEnumerator();
當前proeperty得到的值和正常工作

這是否意味着我必須從IEnumerator明確的繼承類,如果我想使用Current沒有實現它的方法和屬性一個IEnumerator類型變量?

感謝, 羅伊

+1

'GetEnumerator()'總是返回一個* new *枚舉器。 *多個*統計員可以同時使用。他們並不都是一個職位。 –

回答

4

這是因爲,爲了使Current成爲非空,你需要調用MoveNext()在同一對象上。

您當前的代碼在臨時對象上調用MoveNext()。這是怎麼回事,當你調用

g.GetEnumerator().MoveNext()`; 
Console.WriteLine(g.GetEnumerator().Current); 
  • GetEnumerator()調用返回的對象上x
  • x.MoveNext()進行
  • x符合垃圾收集,因爲它沒有從任何引用的通話變量在你的程序中。
  • 當你調用g.GetEnumerator().Current,一個新的對象y返回
  • y.Current進行呼叫時,返回null,因爲當時的MoveNext的對象y

當你添加一個變量a沒有呼叫,但是,您在同一個對象上調用MoveNextCurrent,修復問題:

  • GetEnumerator()收益進行呼叫a.MoveNext()對象x,分配給變量a
  • 呼叫a.Current通過調用GetEnumerator進行
5

你正在創建GenEnumerator每次的新實例,這就是爲什麼你Currentnull。而是將其存儲在一個字段中並使用它。

var e = g.GetEnumerator(); 
if(e.MoveNext()) 
{ 
    var current = e.Current; 
} 
相關問題