Implementieren von IList<T> in F#
-
22-12-2019 - |
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
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.