4

该类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>有效?


我想返回 aInsertionSortedSet<T>.Enumerator而不是界面,因为它避免了我需要删除的拳击。

4

3 回答 3

7

它抱怨是因为 GetEnumerator() 返回IEnumerator<T>接口IEnumerable<T>。为了满足,您的类型必须返回IEnumerator<T>(以及一个明确的类型IEnumerator)。

但是,很多时候希望类返回比接口指定的更具体的类型,但是接口不允许这样的协变返回类型。因此,要做到这一点,您可以执行List<T>GetEnumerator()返回您的特定枚举器,但您还必须为返回 an和返回an 实现显式实现:IEnumerable.GetEnumerator()IEnumeratorIEnumerable<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()了 3 次:

  • 一旦明确地IEnumerable<T>
  • 一旦明确地Enumerable
  • 一次具有非常特定于列表的返回

如果你愿意,你可以在你的课堂上做同样的事情(它应该是你开始的方式)但是如果你这样做,你必须明确地实现IEnumerable<T>.GetEnumerator()IEnumerable.GetEnumerator()

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

对象资源管理器的屏幕截图

于 2012-01-06T21:50:59.070 回答
0

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

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

于 2012-01-06T21:51:40.057 回答
0

您正在寻找的称为返回类型协方差,更多这里C# 支持返回类型协方差吗?

这可以通过显式实现接口返回IEnumerator<T>并实现同名公共方法返回枚举器来实现。

于 2012-01-06T21:53:41.433 回答