接口实现和返回类型

时间:2012-01-06 21:43:45

标签: c# generics interface enumerator

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而不是界面,因为它避免了拳击,我需要删除。

3 个答案:

答案 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>
  • 一次特定于列表的回复

如果你愿意,你可以在你的班级做同样的事情(这就像你开始的那样)但如果你这样做,你必须明确地实施EnumerableIEnumerable<T>.GetEnumerator()

如果导航到定义,您可以通过选择它满足的不同接口(或通过将IEnumerable.GetEnumerator()实例分配给List<T>或{{1}来查看对象浏览器中的其他定义。引用并转到定义):

Screenshot of Object Explorer

答案 1 :(得分:0)

要允许使用foreach迭代类,不需要实现任何接口。您需要的只是实现返回Enumerator<T>

的GetEnumerator方法

但如果您希望您的类支持标准迭代接口IEnumerable<T>,您可以明确地实现它:IEnumerable<T>.GetEnumerator() { return GetEnumerator(); }

答案 2 :(得分:0)

您正在寻找的内容称为返回类型协方差,此处更多为Does C# support return type covariance?

这可以通过使用接口的显式实现来返回IEnumerator<T>并实现同名的公共方法来返回Enumerator来实现。