2010-06-05 51 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