سؤال

لدي سؤال حول 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" ولا يوجد طريقة تمديد "getenumerator" قبول الوسيطة الأولى من النوع ". ؟)

هل هناك أي خطأ في الكود؟

شكرا مقدما


شكرا يا رفاق. حصلت عليه.

هل كانت مفيدة؟

المحلول

إنه IEnumerable.GetEnumerator() (أو IEnumerable<T>.GetEnumerator())، ليس IEnumerator.GetEnumerator(). الأعضاء على IEnumerator نكون MoveNext(), 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();
    }
}

نصائح أخرى

الأطفال List<int>, الذي ينفذ IEnumerable<int> و IEnumerable. ال GetEnumerator() يتم تعريف الطريقة لتلك الواجهات ، وليس ل IEnumerator.

children as IEnumerator يجب أن يؤدي إلى فارغ.

لا يوجد GetEnumerator() طريقة على Ienumerator واجهه المستخدم. هل تحاول استخدام ienumerable واجهة ربما؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top