2012-01-06 91 views
26

我正在嘗試編寫我自己的(簡單)List實現。這是我做過什麼至今:實施IEnumerable的麻煩<T>

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]; 
     } 
    } 

我收到約GetEnumerator的錯誤,但:

「provaIEnum.Lista」不實現接口成員 「System.Collections.IEnumerable.GetEnumerator ()」。 'provaIEnum.Lista.GetEnumerator()'無法實現 'System.Collections.IEnumerable.GetEnumerator()',因爲它不包含 具有匹配的返回類型'System.Collections.IEnumerator'。

我不知道我是否理解VS試圖告訴我什麼,我不知道如何解決它。

感謝您的時間

+0

請注意,你不應該這樣寫你的枚舉器,因爲目前你可以在'foreach'中調用你的內部數組(在foreach中調用'Add'不會導致異常)。 [see](http://stackoverflow.com/questions/24142614/when-should-i-separately-implement-ienumeratort) – nawfal 2014-07-08 16:59:28

+0

@nawfal好點,錯誤總是看着我們;) – BlackBear 2014-07-08 17:46:19

回答

41

由於IEnumerable<T>工具IEnumerable你需要實現這個接口,以及在你的類,它有GetEnumerator方法的非通用版本。爲了避免衝突,你可以明確地實現它:

IEnumerator IEnumerable.GetEnumerator() 
{ 
    // call the generic version of the method 
    return this.GetEnumerator(); 
} 

public IEnumerator<T> GetEnumerator() 
{ 
    for (int i = 0; i < Count; i++) 
     yield return _array[i]; 
} 
+1

謝謝,我不知道IEnumerable 實現IEnumerable(儘管聽起來很明顯:P) – BlackBear 2012-01-06 15:54:03

+5

由於您沒有使用'System.Collections.'顯式地限定'IEnumerator'和'IEnumerable.GetEnumerator',如果您沒有'使用System.Collections', ,說(非常不好意思)「IEnumerator」需要一個通用的參數! – PJTraill 2016-04-04 16:42:15

10

你需要實現非泛型GetEnumerator方法,以及:

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

由於IEnumerable<T>接口擴展IEnumerable,你必須實現在兩者上聲明的方法。

+0

明確的接口實現不能具有+1標準方式的訪問修飾符 – Nuffin 2012-01-06 15:44:36

36

仔細閱讀錯誤信息;它正在告訴你你必須做什麼。您沒有實施System.Collections.IEnumerable.GetEnumerator

當你實現通用IEnumerable<T>你還必須實現System.Collections.IEnumerable的GetEnumerator。

的標準方法,這樣做是:

public IEnumerator<T> GetEnumerator() { whatever } 
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
{ 
    return this.GetEnumerator(); 
} 
+0

+1,不斷學習每一天:) – BlackBear 2012-01-06 15:55:00

4

添加以下方法:

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

還有的GetEnumerator()兩個重載,你必須實現。一個來自IEnumerable<T>並返回IEnumerator<T>。另一個來自IEnumerable並返回IEnumerator。超控應該是這樣的:

IEnumerator IEnumerable.GetEnumerator()

這是因爲IEnumerable<T>實現IEnumerable

1

由於類,MyList<T>繼承IEnumerable<out T>這反過來又繼承了非通用IEnumerable,你有兩個方法需要實現:

IEnumerator<T> IEnumerable<T>.GetEnumerator() 
     { 
      throw new NotImplementedException(); 
     } 

     System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
     { 
      throw new NotImplementedException(); 
     } 

一個簡單的方法做,這是當你聲明你的類:

class MyList<T> : IEnumerable<T> 

右鍵單擊IEnumerable<T>文本並選擇實現接口>實現接口顯式地從上下文菜單中

0

我得到了類似的問題,但我也實現了IEnumerable和IEnumerable。我使用的是自定義類型(Person類)而不是泛型類型T. 對我來說,原因是,命名空間並未包含在文件的頂部。

using System.Collections; 

添加命名空間後,我很好。