2015-12-02 59 views
1

这是一条与Unity中的C#有关的消息,但我假定一般的C#知识将​​应用。C#:自定义IEnumerator?

看看下面的代码:

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(); 
    } 
} 

如果我实例类,然后调用“更新”每帧一次,我得到的日志在下面的输出:

0 
1 
2 
3 
4... 

这工作正常,但是我想在IEnumerator本身中实现一些自定义功能。但是,如果我创建以下文件:

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

,然后更新oringal类,取代“的IEnumerator”的“myIEnumerator”,我得到以下错误:

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

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

+5

我认为这是一个编译器,编译器只支持'IEnumerable','IEnumerable ','IEnumerator'和'IEnumerator '。继承不适用于迭代器块。 – Enigmativity

+1

它在[文件](https://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx),“迭代方法和get访问 的迭代器必须满足下列要求的声明: 返回类型必须是IEnumerable,IEnumerable ,IEnumerator或IEnumerator 。 声明不能有任何ref或out参数。“ – Patrick

回答

2

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

这样做的原因是,C#编译器生成实现那些4个接口(实际上它同时实现IEnumeratorIEnumerable或其通用版本)和该编译程序生成的类的实例中的一个的一类特殊的是什么实际获取从方法返回。通过改变返回类型,你试图说编译器会创建一个你的类的实例来完成枚举。但它不能这样做,因为它实际上并不了解你的类(事实上,你的类可能甚至没有正确枚举)。

+0

啊,这很有道理。感谢您的解释! – Tyson

0

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

看一看在IEnumerator Interface