1

方法について質問がありIEnumerator.GetEnumerator()ます。

public class NodeFull
{
    public enum Base : byte {A = 0, C, G, U };
    private int taxID;
    private List<int> children;

    public int TaxID
    {
        get { return taxID; }
        set { taxID = value; }
    }

    public int this[int i]
    {
        get { return children[i]; }
        set { children[i] = value; }
    }

    public IEnumerator GetEnumerator()
    {
        return (children as IEnumerator).GetEnumerator();
    }

    public TaxNodeFull(int taxID)
    {
        this.taxID = taxID;
        this.children = new List<int>(3);
    }
}

コンパイルしようとすると、エラーメッセージが表示されます

'System.Collections.IEnumerator' には 'GetEnumerator' の定義が含まれておらず、タイプ 'System.Collections.IEnumerator' の最初の引数を受け入れる拡張メソッド 'GetEnumerator' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか? ?)

コードに何か問題がありますか?

前もって感謝します


君たちありがとう。わかった。

4

3 に答える 3

8

それはIEnumerable.GetEnumerator()(またはIEnumerable<T>.GetEnumerator()) であり、 ではありませんIEnumerator.GetEnumerator()。のメンバーIEnumeratorMoveNext()CurrentおよびReset()(およびDisposeジェネリック バージョンの場合) です。はIEnumerable「反復できるもの」(リストなど) でありIEnumerator、データベース カーソルのように、その反復内の現在の状態を表します。

IEnumerableあなたのクラスがそれIEnumerable<T>自体を実装していないのは少し奇妙です。私は次のようなものを期待します:

class NodeFull : IEnumerable<int>
{
    ... other stuff as normal ...

    public IEnumerator<int> GetEnumerator()
    {
        return children.GetEnumerator();
    }

    // Use explicit interface implementation as there's a naming
    // clash. This is a standard pattern for implementing IEnumerable<T>.
    IEnumerator IEnumerable.GetEnumerator()
    {
        // Defer to generic version
        return GetEnumerator();
    }
}
于 2010-09-17T16:26:55.650 に答える
2

children はList<int>であり、 および を実装IEnumerable<int>IEnumerableます。GetEnumerator()メソッドは、 ではなく、これらのインターフェイスに対して定義されますIEnumerator

children as IEnumeratornull になるはずです。

于 2010-09-17T16:27:38.627 に答える
1

IEnumeratorインターフェイスにはGetEnumerator()メソッドがありません。おそらくIEnumerABLEインターフェイスを使用しようとしていますか?

于 2010-09-17T16:27:22.767 に答える