【问题标题】:Can't implement both GetEnumerator return IEnumerator AND IEnumerator<T> when implementing ICollection<T>实现 ICollection<T> 时无法同时实现 GetEnumerator 返回 IEnumerator 和 IEnumerator<T>
【发布时间】:2013-10-17 03:29:47
【问题描述】:

我正在编写一个实现ICollection&lt;T&gt; 的简单集合类。基本上一切正常,除非我添加一个IEnumerator&lt;T&gt; GetEnumerator() 方法,它抱怨我没有IEnumerator GetEnumerator() 方法。反之亦然。我不能同时拥有两者,因为它们仅在返回类型上有所不同,所以我真的很困惑编译器想要从我这里得到什么。

这里是准确的错误,因为它们是给我的:

错误 CS0738:MyClass&lt;T&gt;' does not implement interface memberSystem.Collections.Generic.IEnumerable.GetEnumerator()' 和最佳实现候选 MyClass&lt;T&gt;.GetEnumerator()' return typeSystem.Collections.IEnumerator' 与接口成员返回类型 `System.Collections.Generic.IEnumerator' 不匹配'

或者,我也可以:

错误 CS0738:MyClass&lt;T&gt;' does not implement interface memberSystem.Collections.IEnumerable.GetEnumerator()' 和最佳实现候选 MyClass&lt;T&gt;.GetEnumerator()' return typeSystem.Collections.Generic.IEnumerator' 与接口成员返回类型 `System.Collections.IEnumerator' 不匹配

【问题讨论】:

标签: c# .net generics


【解决方案1】:

明确地实现它们:

IEnumerator IEnumerable.GetEnumerator() {
}

IEnumerator<T> IEnumerable<T>.GetEnumerator() {
}

// etc.

显式接口实现是如何实现的。在 MSDN 上阅读它:http://msdn.microsoft.com/en-us/library/aa288461(v=vs.71).aspx

【讨论】:

  • 您可能不希望 IEnumerable 版本是明确的。
【解决方案2】:

使用explicit interface implementation。这正是List&lt;T&gt; 实现IEnumerableIEnumerable&lt;T&gt; 的方式,指向第三个GetEnumerator 方法:

IEnumerator IEnumerable.GetEnumerator()
{
    return new List<T>.Enumerator(this);
}

IEnumerator<T> IEnumerable<T>.GetEnumerator()
{
    return new List<T>.Enumerator(this);
}

public List<T>.Enumerator GetEnumerator()
{
    return new List<T>.Enumerator(this);
}

通过这种声明,您可以拥有几个同名的方法——只要它们实现了一些接口方法。

【讨论】:

  • 谢谢你的回答,我支持你,但另一个类似的答案提前一分钟出现
  • @FranciscoRyanTolmaskyI 比我晚了 1:27,但没关系 :) 最重要的是你解决了你的问题!
【解决方案3】:

ICollection 扩展了 IEnumerable。因此你不想在你的班级上做 IEnumerable

http://msdn.microsoft.com/en-us/library/92t2ye13.aspx

【讨论】:

  • 如果 T 相同,它通过识别您不需要 IEnumberable 和 ICollection 来解决问题。
  • ICollection 是一个接口。它不提供任何实现。
  • 很明显,但是由于它继承自IEnumerable,你已经得到了GetEnumerator函数,你不需要执行两次,除非上面指定的T不一样。那么两者都做是有意义的。
  • 它继承自 IEnumerable 和 IEnumerable。这两个接口定义了两个名为 GetEnumerator 的函数。这些函数具有不同的签名,因此需要单独的实现。由于 ICollection 是一个接口,它不提供任何实现。
猜你喜欢
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 2018-02-15
  • 2016-06-21
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多