Question

J'ai regardé partout et DONC à internet, mais ne peut toujours pas comprendre ce que je suis absent et comment mettre en œuvre générique interface IList en F# pour ce type:

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

Maintenant compilateur se plaint que je n'ai pas mis en œuvre les Collections.IEnumerable.GetEnumerator() et je le sais, mais je ne sais vraiment pas comment le faire.

Mise à jour: Résultat Final ci-dessous.Un grand merci à M.Guirlande.Aussi, vaut la peine de souligner que j'ai référencé seul Système.Les Collections.Générique et j'ai oublié de Système de référence.Collection lors de la non-générique version de IEnumerable résident.Si triste ReSharper ne supporte pas de 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 
Était-ce utile?

La solution

C'est parce que IList a deux GetEnumerator méthodes, l'une pour la IEnumerable<T> interface et un pour les non-générique IEnumerable de l'interface.

Vous pourriez ajouter ce membre pour mettre en œuvre IEnumerable

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

Autres conseils

Le moyen le plus simple est

interface System.Collections.IEnumerable with
    member this.GetEnumerator() = this.Conditions.GetEnumerator() :> _

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top