2015-12-02 55 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