Frage

Ich habe überall in SO und im Internet gesucht, kann aber immer noch nicht herausfinden, was mir fehlt und wie ich eine generische IList-Schnittstelle in F# für diesen Typ implementieren kann:

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

Im Moment beschwert sich der Compiler, dass ich Collections.IEnumerable.GetEnumerator() nicht implementiert habe und ich weiß es, aber ich weiß wirklich nicht, wie ich es machen soll.

Aktualisieren: Endergebnis unten.Vielen Dank an Herrn.Girlande.Außerdem sollte darauf hingewiesen werden, dass ich nur auf System.Collections.Generic verwiesen und vergessen habe, auf System.Collection zu verweisen, wenn eine nicht generische Version von IEnumerable vorhanden ist.Schade, dass ReSharper F# nicht unterstützt.

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 
War es hilfreich?

Lösung

Das ist weil IList hat zwei GetEnumerator Methoden, eine für die IEnumerable<T> Schnittstelle und eine für die Nicht-Generika IEnumerable Schnittstelle.

Sie können dieses Mitglied zur Implementierung hinzufügen IEnumerable

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

Andere Tipps

Der einfachste Weg ist

generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top