2011-06-10 2 views
2
>  type XList<'T> (_collection : seq<'T>) = 
      inherit List<'T> (_collection) 
      member this.Add _item = if not <| this.Contains _item then base.Add _item 
      new() = XList<'T> (Seq.empty<'T>);; 

       inherit List<'T> (_collection) 
     --------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

stdin(47,9): error FS0945: Cannot inherit a sealed type 


Ma compréhension est que la liste < « T> est en fait pas scellé. Non? En outre, cela semble fonctionner très bien en dehors de F # interactive. Ce code exact est dans mon projet F #, et le compilateur le traite sans se plaindre. J'ai la même chose dans quelques projets en C#. Le code fonctionne comme prévu dans tous les cas.F #: Impossible d'hériter de la liste <'T> en F # interactive

Normalement, j'étendrais simplement la liste < 'T> avec une méthode statique (en faisant la "méthode F #"), mais cacher List.Add devrait aussi fonctionner correctement.

Répondre

4

Essayez de bien qualifier le nom du type: inherit System.Collections.Generic.List<'T> (_collection)

+0

Merci, je savais que SCGList et F # liste serait me mordre dans le cul finalement. J'ai cassé ma cerise, maintenant. – MiloDC

2

Je suppose que votre F # interactif a un ensemble différent d'espaces de noms open que votre code de projet F #? Autrement dit, est-ce System.Collections.Generic.List ou quoi?

5

Comme d'autres déjà expliqué, votre code essaie en fait d'hériter du F # type de liste (qui est scellé). C'est un peu déroutant, mais F # fournit un alias ResizeArray<T> qui signifie le type .NET List<T> générique, donc vous pouvez résoudre cela sans l'aide des noms longs aussi:

type XList<'T> (_collection : seq<'T>) = 
    inherit ResizeArray<'T> (_collection) 
+0

Bonne idée, merci! – MiloDC