2012-04-10 2 views
6

Я хочу создать свой собственный тип коллекций.Inherit from Seq

Я определяю свою коллекцию как:

type A(collection : seq<string>) = 
    member this.Collection with get() = collection 

    interface seq<string> with 
     member this.GetEnumerator() = this.Collection.GetEnumerator() 

Но это не компилируется No implementation was given for 'Collections.IEnumerable.GetEnumerator()

Как мне это сделать?

+6

Вам необходимо 'IEnumerable', а также' 'IEnumerable

ответ

12

В F # seq действительно просто псевдоним для System.Collections.Generic.IEnumerable<T>. Общий IEnumerable<T> также реализует не общий код IEnumerable, и поэтому ваш тип F # также должен сделать это.

Самый простой способ это просто иметь необщего один вызов в один общий

type A(collection : seq<string>) = 
    member this.Collection with get() = collection 

    interface System.Collections.Generic.IEnumerable<string> with 
    member this.GetEnumerator() = 
     this.Collection.GetEnumerator() 

    interface System.Collections.IEnumerable with 
    member this.GetEnumerator() = 
     upcast this.Collection.GetEnumerator() 
+3

Вы можете сохранить несколько символов с' это. Collection.GetEnumerator() |> upcast' –

+0

@JoelMueller Я бы никогда раньше не видел оператора upcast. Гораздо приятнее. Благодаря! – JaredPar

+6

@JoelMueller: Еще короче: 'x.Collection.GetEnumerator():> _' – Daniel