2011-01-14 87 views
6

基本上假設你有一些收藏:可以在IEnumerator.GetEnumerator()中返回IEnumerator <T> .GetEnumerator()嗎?

public class FurCollection : IEnumerable<FurStrand> 
{ 
    public IEnumerator<FurStrand> GetEnumerator() 
    { 
     foreach(var strand in this.Strands) 
     { 
     yield return strand; 
     } 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return this.GetEnumerator(); 
    } 
} 

這是可以接受的?或者是這種容易發生錯誤或不正確的做法?我幾乎總是使用IEnumerator<T>,但我仍然希望非通用版本穩定並正確實施。

+0

我敢肯定你的意思是** IEnumerable **而不是** IEnumerator ** ... – 2011-01-14 18:31:02

+0

謝謝對不起,我很快寫了這個示例。 – 2011-01-14 18:55:39

回答

10

這是完全標準的,建議遵守DRY和其他問題。

注意

return strand; 

應該

yield return strand; 

此外,它看起來像this.Strands已經實現IEnumerable<FurStrand>所以你也可以說

return this.Strands.GetEnumerator(); 
+1

我同意,良好的做法 – 2011-01-14 18:29:05

5

不,這是完全可以接受的。甚至推薦。

4

這不僅是很好的做法,但是如果沒有它,你的項目將無法完成,因爲IEnumerable<T>繼承IEnumerable。看看IEnumerable<T>定義:

public interface IEnumerable<out T> : IEnumerable 
    IEnumerator<T> GetEnumerator(); 
} 

您必須實現非通用版本,否則你會得到一個錯誤「......不實現接口成員......」

相關問題