2012-01-06 121 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; 

添加命名空间后,我很好。