使用F#2.0和FSI我有以下内容:
let foo = List(xs)//works
let bar = new List(xs) //need type parameter 'The type System.Collectsion.Generic<_> expects 1 type argument 0 was given
现在我当然可以这样做:
let baz = new List<TypeOItemsInXs>(xs)//why?
现在我能合理地做些什么吗? 为什么我必须在工作类型推断或警告免费代码之间进行选择(如果'List'是一次性的,你会得到一个警告,你应该使用'new'来明确它)。
任何解决方法?这是一个错误还是什么?
答案 0 :(得分:13)
您仍然可以使用带有通配符_
的类型推断:
open System.Collections.Generic
let xs = [1;2;3]
let bar = new List<_>(xs)
顺便说一句,要区分F#list和.NET List<T>
容器,F#已将.NET List<T>
重命名为ResizeArray<T>
,它位于Microsoft.FSharp.Collections
中,并且此命名空间已打开默认情况下:
let bar2 = new ResizeArray<_>(xs)
答案 1 :(得分:8)
尹祝答案是对的,我想补充一个细节。在F#中,您可以使用或不使用new
关键字来调用.NET构造函数。如果省略new
,则不需要添加泛型参数,但如果使用new
,则必须添加泛型参数,即使您让类型推断使用通配符{{1}进行工作也是如此}。
因此,您可以说:
_
或
> ResizeArray([1; 2; 3;]);;
val it : System.Collections.Generic.List<int> = seq [1; 2; 3]
但不是:
> new ResizeArray<_>([1; 2; 3;]);;
val it : ResizeArray<int> = seq [1; 2; 3]