代码之家  ›  专栏  ›  技术社区  ›  mpen

如何定义迭代器接口类型?

c#
  •  8
  • mpen  · 技术社区  · 14 年前

    我编写了一个实现 IEnumerable<T> . 我有个方法可以返回 MyClass . 如果我尝试 yield return 在这个方法中,编译器告诉我“…不能是迭代器块,因为…不是迭代器接口类型“”。

    那么,我如何定义自己的接口迭代器类型呢?它必须是“抽象的”(不能定义任何方法)?

    我要做的是编写一组可链接的方法,因此每个方法都应该返回 类名 . 但我需要 类名 是某种可枚举的。与其使用一些底层数据类型,我希望我可以 生利 到处都是。


    @ ODI:

    class SharpQuery : IEnumerable<HtmlNode>
    {
        public SharpQuery Find(string selector)
        {
            foreach (var n in this)
            {
                // filter the results
                yield return node;
            }
        }
    }
    
    3 回复  |  直到 8 年前
        1
  •  13
  •   Mark Byers    14 年前

    不,那是不可能的。看看你为什么认为你有课 Zoo 实现 IEnumerable<Animal> 但也有很多其他成员。一 动物园 是一个 IEnumerable<动物> 但不一定是相反的——一系列动物只是一系列动物。没有动物园管理员,没有商店,没有入场费,或其他任何使动物园成为动物园的东西。

    当你使用 yield return x 返回类型不能是 动物园 因为你没有动物园,你只有一系列的动物。

    你能做的是把它称为 new Zoo(foo()) 在哪里? foo 返回 IEnumerable<动物> 并将构造函数添加到 动物园 接受 IEnumerable<动物> .

        2
  •  2
  •   Ryan Prechel    12 年前

    根据C语言规范第4.0版第8.2节:

    包含一个或多个的块 yield 语句称为迭代器块。迭代器块用于实现作为迭代器的函数成员。

    第10.14节规定迭代器的返回类型必须是以下类型之一:

    • IEnumerator
    • IEnumerable
    • IEnumerator<T>
    • IEnumerable<T>

    根据第10.14.4节,调用迭代器不会立即执行迭代器块中的代码。相反,将创建并返回实现以下接口的枚举器对象:

    • 迭代器
    • IEnumerator<t>
    • IDisposable

    枚举器对象通常是编译器生成的具有私有可访问性的嵌套类的实例。

        3
  •  2
  •   abhishek    8 年前

    我想你用的时候 yield return x 你将制作一个 IEnumerable X型。所以在你的情况下,它是不可数的

    从一个类继承不会自动意味着它将隐式地将自己强制转换为该类型。所以如果你写

    class SharpQuery 
    {
        public IEnumerable<HtmlNode> RepositoryItems { get; set; }
        public IEnumerable<HtmlNode> Find(string selector)
        {
            foreach (var n in this.RepositoryItems)
            {
                // filter the results
                yield return node;
            }
        }
    }
    

    它起作用了。IEnumerable与SharpQuery不同。