F #: невозможно наследовать от List <'T> в F # интерактив - PullRequest
2 голосов
/ 10 июня 2011
  >     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

Насколько я понимаю, список <'T> на самом деле не запечатан.Нет?

Кроме того, кажется, что это отлично работает вне F # интерактива.Этот точный код находится в моем проекте F #, и компилятор обрабатывает его без жалоб.У меня происходит то же самое в нескольких проектах на C #.Код работает, как и ожидалось, в каждом случае.

Обычно я просто расширяю List <'T> статическим методом (делая это "способом F #"), но скрытие List.Add должно работать нормальнотоже.

Ответы [ 3 ]

5 голосов
/ 10 июня 2011

Как уже объяснили другие, ваш код на самом деле пытается наследовать от типа списка F # (который запечатан). Это немного сбивает с толку, но F # предоставляет псевдоним ResizeArray<T>, который обозначает универсальный тип .NET List<T>, так что вы можете решить эту проблему без использования длинных имен:

type XList<'T> (_collection : seq<'T>) = 
  inherit ResizeArray<'T> (_collection) 
4 голосов
/ 10 июня 2011

Попробуйте полностью указать имя типа: inherit System.Collections.Generic.List<'T> (_collection)

2 голосов
/ 10 июня 2011

Я предполагаю, что ваш F # интерактив имеет другой набор open пространств имен, чем ваш код проекта F #?То есть это System.Collections.Generic.List или как?

...