2010-06-05 49 views
8

我收到此錯誤消息,我找不到原因!有關IEnumerable.GetEnumerator()的錯誤消息

Error 1 'Exo5Chap12.ShortCollection<T>' does not implement interface member 
'System.Collections.IEnumerable.GetEnumerator()'. 
'Exo5Chap12.ShortCollection<T>.GetEnumerator()' cannot implement 
'System.Collections.IEnumerable.GetEnumerator()' because it does not have the matching 
return type of 'System.Collections.IEnumerator'.  
E:\MyFolders\Dev\c#\Chapter12\Exo5Chap12\Exo5Chap12\exo5.cs 9 18 Exo5Chap12 

這是帶有GetEnumerator()實現的代碼。 有什麼不對?

public class ShortCollection<T> : IList<T> 
{ 
    protected Collection<T> innerCollection; 
    protected int maxSize = 10; 
    public IEnumerator<T> GetEnumerator() 
    { 
     return (innerCollection as IEnumerator<T>).GetEnumerator(); 
    } 
} 
+0

簡單地不要爲IEnumerable和IEnumerable實現都強制轉換innerCollection對象。請在下面發佈的答案中查看我的完整代碼... – code4life 2010-06-05 19:05:23

+1

我注意到錯誤消息告訴你*確切地說*這裏發生了什麼問題:IEnumerable尚未實現,是否需要實現,以及唯一的方法可能會實現它具有錯誤的返回類型。這已經花了相當複雜的錯誤分析,但還不足以讓您自己診斷問題。一個不同的錯誤信息會更有幫助嗎?什麼樣的錯誤信息可以幫助您在不尋求幫助的情況下診斷問題? – 2010-06-05 20:54:47

+0

我是新手,正在閱讀Wrox(初學者)Visual C#書。我不知道我必須同時實現IEnumerable和IEnumerable ,因爲它在書中沒有提及。此外,代碼是練習的答案(想知道他們是否在打印之前檢查了代碼)。我看了一下msdn網站和wrox論壇,但他們也沒有提到它。我必須說IEnumerable對我來說很難學。但是現在我再次讀取錯誤,我同意這是有道理的。 – 2010-06-05 21:30:26

回答

4

IEnumerableIEnumerable<T>是不同的接口,你的代碼必須同時實現。您的代碼只實現了IEnumerable<T>的GetEnumerator(),但不是IEnumerable的GetEnumerator()。你應該考慮安裝ReSharper,這可以很容易地修復這樣的錯誤。

+0

Resharper(R#)+1 ...這真是太神奇了。 – 2010-06-05 19:01:13

+0

Joel,感謝您的編輯。我在哪裏可以找到格式化選項的文檔? – Achim 2010-06-05 19:01:40

+0

textarea上方的橙色問號。 – wRAR 2010-06-05 19:26:33

3

你需要實現一些事情:

public class ShortCollection<T> : IList<T> 
{ 
    protected Collection<T> innerCollection; 
    protected int maxSize = 10; 

    #region IList<T> Members 

    public int IndexOf(T item) 
    { 
     return innerCollection.IndexOf(item); 
    } 

    public void Insert(int index, T item) 
    { 
     innerCollection.Insert(index, item); 
    } 

    public void RemoveAt(int index) 
    { 
     innerCollection.RemoveAt(index); 
    } 

    public T this[int index] 
    { 
     get 
     { 
      return innerCollection[index]; 
     } 
     set 
     { 
      innerCollection[index] = value; 
     } 
    } 

    #endregion 

    #region ICollection<T> Members 

    public void Add(T item) 
    { 
     innerCollection.Add(item); 
    } 

    public void Clear() 
    { 
     innerCollection.Clear(); 
    } 

    public bool Contains(T item) 
    { 
     return innerCollection.Contains(item); 
    } 

    public void CopyTo(T[] array, int arrayIndex) 
    { 
     innerCollection.CopyTo(array, arrayIndex); 
    } 

    public int Count 
    { 
     get { return innerCollection.Count; } 
    } 

    public bool IsReadOnly 
    { 
     get { return false; } 
    } 

    public bool Remove(T item) 
    { 
     return innerCollection.Remove(item); 
    } 

    #endregion 

    #region IEnumerable<T> Members 

    public IEnumerator<T> GetEnumerator() 
    { 
     return innerCollection.GetEnumerator(); 
    } 

    #endregion 

    #region IEnumerable Members 

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     return innerCollection.GetEnumerator(); 
    } 

    #endregion 
} 

該代碼將編譯... :)

+0

非常感謝! – 2010-06-05 20:41:19

12

正如其他人所說,你需要實現IEnumerable以及IEnumerable<T>。然而,由於IEnumberable<T>本身implemets IEnumerable這是小事,只是打電話給你的通用GetEnumerator()

public class ShortCollection<T> : IList<T> 
{ 
    protected Collection<T> innerCollection; 
    protected int maxSize = 10; 
    public IEnumerator<T> GetEnumerator() 
    { 
     return innerCollection.GetEnumerator(); 
    } 

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

我假設你有方法實際添加並從innerCollection刪除和剛走出來爲簡潔起見,因爲他們沒與手頭的問題無關。

+0

非常感謝!是的,我把剩下的東西留下了。再次感謝! – 2010-06-05 20:42:43

+0

這是一個比選擇正確的答案好得多的答案,因爲它包含一個代碼示例。 @Bon_chan考慮改變你的選擇。 – 2014-03-23 17:10:42

+0

我花了尷尬的時間試圖解決這個問題。 IEnumerator IEnumerable.GetEnumerator()'+1。 – 2015-01-21 22:40:21