2014-01-10 6 views
0

я посмотрел весь SO и интернет, но до сих пор не может понять, что я пропавший без вести, и как реализовать общий интерфейс IList в F # для такого типа:Реализация IList <T> в 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 
+0

https://github.com/fsharp/fsharpx/blob/master/src/FSharpx.Collections .Experimental/DList.fs # L71 –

ответ

3

Это потому, что IList имеет два GetEnumerator методы, один для интерфейса IEnumerable<T> и один для необщего IEnumerable интерфейса.

Вы можете добавить этот элемент для реализации IEnumerable

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

Самый простой способ

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

 Смежные вопросы

  • Нет связанных вопросов^_^