C#: Custom IEnumerator?

本文关键字:IEnumerator Custom | 更新日期: 2023-09-27 18:25:35

这是一条关于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();
    }
}

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

0
1
2
3
4...

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

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

然后更新orinal类,将"IEnumerator"替换为"myIEnumerater",我得到以下错误:

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

我在这里做错了什么,如何制作自己的自定义IEnumerator?

C#: Custom IEnumerator?

只能在返回类型为IEnumeratorIEnumerableIEnumerator<T>IEnumerable<T>的方法中使用yield。不能将方法的返回类型更改为实现其中一个接口的类型,这是没有意义的。

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

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

查看IEnumerator接口