List<T>
类实现IEnumerable<T>
接口。它有一个方法GetEnumerator
,返回List<T>.Enumerator
。
我有一个如下所示的类,它给出了一个编译错误,指出GetEnumerator
的返回类型与接口不匹配。
public class InsertionSortedSet<T> : IEnumerable<T>
{
public struct Enumerator : IEnumerator<T>
{
// Required interface implemented
}
// Other interface methods implemented
public Enumerator GetEnumerator()
{
return new Enumerator(this);
}
}
'Entities.Helpers.InsertionSortedSet'未实现接口成员'System.Collections.Generic.IEnumerable.GetEnumerator()'。 'Entities.Helpers.InsertionSortedSet.GetEnumerator()'无法实现'System.Collections.Generic.IEnumerable.GetEnumerator()',因为它没有匹配的返回类型'System.Collections.Generic.IEnumerator'。
鉴于List<T>
似乎返回它自己的Enumerator
类(不是接口)但它确实实现了Enumeration<T>
接口我很困惑,因为我看不清楚是什么我和那个班级有所不同。
List<T>
在哪里工作? 我想返回一个InsertionSortedSet<T>.Enumerator
而不是界面,因为它避免了拳击,我需要删除。
答案 0 :(得分:7)
它抱怨,因为GetEnumerator()为IEnumerator<T>
接口返回IEnumerable<T>
。要满足,您的类型必须返回IEnumerator<T>
(以及IEnumerator
的明确的类型)。
但是,很多时候,类需要返回比接口指定的更具体的类型,但接口不允许这样的协变返回类型。为此,您可以执行List<T>
所做的工作并让GetEnumerator()
返回您的特定枚举器,但您还必须为IEnumerable.GetEnumerator()
实现显式实现,以返回IEnumerator
以及返回IEnumerable<T>.GetEnumerator()
的{{1}}:
IEnumerator<T>
如果你看 // This is your specific version, like List<T> does
public Enumerator GetEnumerator()
{
return new Enumerator(this);
}
// This is the one with the return value IEnumerator<T> expects
IEnumerator<T> IEnumerable<T>.GetEnumerator()
{
return new Enumerator(this);
}
// Plus, it also expects this as well to satisfy IEnumerable
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
,你会发现它实施了List<T>
三次:
GetEnumerator()
IEnumerable<T>
如果你愿意,你可以在你的班级做同样的事情(这就像你开始的那样)但如果你这样做,你必须明确地实施Enumerable
和IEnumerable<T>.GetEnumerator()
如果导航到定义,您可以通过选择它满足的不同接口(或通过将IEnumerable.GetEnumerator()
实例分配给List<T>
或{{1}来查看对象浏览器中的其他定义。引用并转到定义):
答案 1 :(得分:0)
要允许使用foreach
迭代类,不需要实现任何接口。您需要的只是实现返回Enumerator<T>
。
但如果您希望您的类支持标准迭代接口IEnumerable<T>
,您可以明确地实现它:IEnumerable<T>.GetEnumerator() { return GetEnumerator(); }
答案 2 :(得分:0)
您正在寻找的内容称为返回类型协方差,此处更多为Does C# support return type covariance?
这可以通过使用接口的显式实现来返回IEnumerator<T>
并实现同名的公共方法来返回Enumerator来实现。