سؤال

لقد بحثت في جميع أنحاء SO والإنترنت ولكن ما زلت لا أستطيع معرفة ما أفتقده وكيفية تنفيذ واجهة IList العامة في F# لمثل هذا النوع:

type OrCondition() as self =
    inherit Condition()
    member val Conditions: List<Condition> = new List<Condition>() with get, set
    interface IList<Condition> with
        member this.Item 
            with get(index) = self.Conditions.[index]
            and  set(index)(value) = self.Conditions.[index] <- value
        member this.IndexOf item = self.Conditions.IndexOf(item)
        member this.Insert(index, item) = self.Conditions.Insert(index, item)
        member this.RemoveAt(index) = self.Conditions.RemoveAt(index)
        member this.Count with get() = self.Conditions.Count
        member this.IsReadOnly with get() = false
        member this.Add(item) = self.Conditions.Add(item)
        member this.Clear() = self.Conditions.Clear()
        member this.Contains(item) = self.Conditions.Contains(item)
        member this.CopyTo(conditions, index) = self.Conditions.CopyTo(conditions, index)
        member this.Remove(item) = self.Conditions.Remove(item)
        member this.GetEnumerator() = (Seq.cast<Condition> self.Conditions).GetEnumerator()

يشكو المترجم حاليًا من أنني لم أقم بتنفيذ Collections.IEnumerable.GetEnumerator() وأنا أعلم ذلك، لكنني حقًا لا أعرف كيفية القيام بذلك.

تحديث: النتيجة النهائية أدناه.شكر كبير للسيد.جارلاند.تجدر الإشارة أيضًا إلى أنني أشرت فقط إلى System.Collections.Generic ونسيت الإشارة إلى System.Collection عند وجود إصدار غير عام من IEnumerable.ReSharper المحزن جدًا لا يدعم F #.

open System.Collections
open System.Collections.Generic

type OrCondition() as self =
    inherit Condition()
    member val Conditions = new List<Condition>() with get, set
    interface IList<Condition> with
        member this.Item 
            with get(index) = self.Conditions.[index]
            and  set(index)(value) = self.Conditions.[index] <- value
        member this.IndexOf item = self.Conditions.IndexOf(item)
        member this.Insert(index, item) = self.Conditions.Insert(index, item)
        member this.RemoveAt(index) = self.Conditions.RemoveAt(index)
        member this.Count with get() = self.Conditions.Count
        member this.IsReadOnly with get() = false
        member this.Add(item) = self.Conditions.Add(item)
        member this.Clear() = self.Conditions.Clear()
        member this.Contains(item) = self.Conditions.Contains(item)
        member this.CopyTo(conditions, index) = self.Conditions.CopyTo(conditions, index)
        member this.Remove(item) = self.Conditions.Remove(item)
        member this.GetEnumerator() = self.Conditions.GetEnumerator() :> IEnumerator<Condition>
        member this.GetEnumerator() = self.Conditions.GetEnumerator() :> IEnumerator 
هل كانت مفيدة؟

المحلول

هذا بسبب IList لديه اثنين GetEnumerator طرق واحدة ل IEnumerable<T> واجهة واحدة لغير عامة IEnumerable واجهه المستخدم.

يمكنك إضافة هذا العضو للتنفيذ IEnumerable

member this.GetEnumerator() = (this.Conditions :> IEnumerable).GetEnumerator()

نصائح أخرى

أبسط الطريقة هي

giveacodicetagpre.

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