C#:自定义 IEnumerator?

C#: Custom IEnumerator?

这是一条关于 Unity 中的 C# 的消息,但我假设一般的 C# 知识都适用。

取以下代码:

class myClass
{
    IEnumerator myEnumerator;
    public IEnumerator theEnumerator()
    {
        int i = 0;
        while (true)
        {
            Debug.Log(i++);
            yield return null;
        }
    }

    public void Update()
    {
        if (myEnumerator == null) { myEnumerator = theEnumerator(); }
        myEnumerator.MoveNext();
    }
}

如果我实例化 class,然后每帧调用一次 "Update",我会在日志中得到以下输出:

0
1
2
3
4...

这很好用,但是我想在 IEnumerator 本身中实现一些自定义功能。但是如果我创建以下内容:

public class myIEnumerator : IEnumerator
{
    public int myCustValue;
    public void myCustFunction(){}
}

然后更新原始 class,替换 "IEnumerator" 和 "myIEnumerator",我得到以下错误:

The body of `myClass.theEnumerator()' cannot be an iterator block because `myIEnumerator ' is not an iterator interface type

我在这里做错了什么,我怎样才能制作自己的自定义 IEnumerator?

我不熟悉 Unity,但我认为您必须实现 IEnumerator 接口。缺少方法 MoveNext()Reset()

看看 IEnumerator Interface

您只能在 return 类型为 IEnumeratorIEnumerableIEnumerator<T>IEnumerable<T> 的方法中使用 yield。您不能将方法的 return 类型更改为实现这些接口之一的类型,这没有意义。

原因是 C# 编译器生成了一个特殊的 class 来实现这 4 个接口之一(实际上它同时实现了 IEnumeratorIEnumerable 或其通用版本) 并且该编译器生成的实例 class 是实际从该方法中获取 return 的实例。通过更改 return 类型,您试图说编译器将创建一个 class 的实例来进行枚举。但它不能那样做,因为它实际上对你的 class 一无所知(事实上你的 class 甚至可能无法正确枚举)。