2009-11-24 124 views
0

我有一個foreach環路像下面迭代時,foreach循環是否複製IEnumerable的每個項目?

 foreach (XYZ split in this.splits) 
     { 
      // this code is inserted for debug purpose only 
      bool check = object.ReferenceEquals(splits.First(), split); 
      ..... 
     } 

當我在this.splits有單個元件,檢查返回false。我通過其他方式檢查,檢查總是返回錯誤。任何想法爲什麼發生這種情況?

回答

5

取決於枚舉器的實施方式。該實現可以自由地返回副本或對象本身。事實上,它可以返回任何喜歡的東西;例如,Enumerable.Range返回一個數字序列,並且沒有任何元素實際存儲在任何地方。它們在飛行中生成。如果返回類型是一個值類型,它肯定是一些東西的副本。

此外,沒有什麼要求對象每次調用GetEnumerator時都返回相同的序列。在你的代碼示例中,它在foreach中執行一次,而另一次調用.First。這些序列不需要等同。

+0

謝謝你。我很快檢查了IEnumarable創建的地方,並且我發現這是我發現的 從rec in recs中選擇新的XYZ(rec) 再次感謝您的幫助。 – malay 2009-11-24 09:09:39