[英]Interface implementations and return types
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
而不是接口,因为它避免了拳击,我需要删除。
它抱怨,因为GetEnumerator()为IEnumerable<T>
接口返回IEnumerator<T>
。 要满足,您的类型必须返回IEnumerator<T>
(以及IEnumerator
的显式)。
但是,很多时候,类需要返回比接口指定的更具体的类型,但是接口不允许这样的协变返回类型。 所以要做到这一点,你可以做List<T>
做的事情并让GetEnumerator()
返回你的特定枚举器,但是你还必须实现IEnumerable.GetEnumerator()
显式实现,它返回一个IEnumerator
和IEnumerable<T>.GetEnumerator()
返回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>
实例分配给IEnumerable
或IEnumerable<T>
引用并转到定义)来查看对象浏览器中的其他定义:
要允许使用foreach
迭代类,不需要实现任何接口。 您需要的只是实现返回Enumerator<T>
GetEnumerator方法。
但是如果你希望你的类支持标准的迭代接口IEnumerable<T>
你可以实现它明确: IEnumerable<T>.GetEnumerator() { return GetEnumerator(); }
IEnumerable<T>.GetEnumerator() { return GetEnumerator(); }
您正在寻找的是返回类型协方差,更多这里C#是否支持返回类型协方差?
这可以通过使用接口的显式实现来返回IEnumerator<T>
并实现同名的公共方法来返回Enumerator来实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.