F#:无法从List<'T>继承在F#互动中

时间:2011-06-10 18:14:52

标签: list f# interactive sealed

  >     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


我的理解是List&lt;'T&gt;实际上没有密封。否?

此外,这似乎在F#interactive之外工作得很好。确切的代码在我的F#项目中,编译器处理它而不抱怨。我在几个C#项目中也有同样的事情。代码在每种情况下都按预期工作。

通常,我只是扩展List&lt;'T&gt;使用静态方法(将其作为“F#方式”),但隐藏List.Add也应该可以正常工作。

3 个答案:

答案 0 :(得分:5)

正如其他人已经解释的那样,您的代码实际上试图从F#列表类型(已密封)继承。这有点令人困惑,但F#提供了一个代表通用.NET ResizeArray<T>类型的别名List<T>,因此您可以在不使用长名称的情况下解决此问题:

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

答案 1 :(得分:4)

尝试完全限定类型名称:inherit System.Collections.Generic.List<'T> (_collection)

答案 2 :(得分:2)

我猜你的F#interactive与你的F#项目代码有一组不同的open命名空间?也就是说,这是System.Collections.Generic.List还是什么?