2011-06-10 31 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 


我的理解是,名單<「T>實際上密封。沒有?F#:無法從列表中<'T> F#互動繼承

此外,這似乎在F#交互式以外工作得很好。這個確切的代碼在我的F#項目中,編譯器無需抱怨就可以處理它。我在幾個C#項目中發生了同樣的事情。代碼在每種情況下都按預期工作。

通常情況下,我只是用一個靜態方法(做它的「F#方法」)擴展List <'T>,但隱藏List.Add也應該很好。

回答

4

嘗試完全限定的類型名稱:inherit System.Collections.Generic.List<'T> (_collection)

+0

謝謝,我知道SCGList和F#名單將最終咬我的屁股。現在打破我的櫻桃。 – MiloDC 2011-06-11 04:50:20

2

我猜你的F#interactive有一套不同於你的F#項目代碼的open命名空間?也就是說,這是System.Collections.Generic.List還是什麼?

5

正如其他人已經解釋過,你的代碼實際上是嘗試從F#列表類型(密封)繼承。這是一個有點混亂,但F#提供了代表通用.NET List<T>類型的別名ResizeArray<T>,這樣你就可以解決這個問題,而無需使用長的名字太:

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

好主意,謝謝! – MiloDC 2011-06-11 04:48:40