使用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
Run Code Online (Sandbox Code Playgroud)
我当然可以这样做:
let baz = new List<TypeOItemsInXs>(xs)//why?
Run Code Online (Sandbox Code Playgroud)
现在有合理的事情吗?为什么我必须在工作类型推断或警告免费代码之间进行选择(如果'List'是一次性的,你会得到一个警告,你应该使用'new'来明确它).
任何解决方法?这是一个错误还是什么?
Yin*_*Zhu 13
您仍然可以使用带有通配符的类型推断_:
open System.Collections.Generic
let xs = [1;2;3]
let bar = new List<_>(xs)
Run Code Online (Sandbox Code Playgroud)
BTW,区分F#列表和.NET List<T>的容器中,F#已经改名为.NET List<T>来ResizeArray<T>,这是在Microsoft.FSharp.Collections这个命名空间,默认打开:
let bar2 = new ResizeArray<_>(xs)
Run Code Online (Sandbox Code Playgroud)
尹朱答案是对的,我想补充一个细节.在F#中,您可以使用或不使用new关键字来调用.NET构造函数.如果new省略,则不需要添加泛型参数,但是如果使用new则必须添加泛型参数,即使您让类型推断使用通配符执行工作也是如此_.
因此,你可以说:
> ResizeArray([1; 2; 3;]);;
val it : System.Collections.Generic.List<int> = seq [1; 2; 3]
Run Code Online (Sandbox Code Playgroud)
要么
> new ResizeArray<_>([1; 2; 3;]);;
val it : ResizeArray<int> = seq [1; 2; 3]
Run Code Online (Sandbox Code Playgroud)
但不是:
> new ResizeArray([1; 2; 3;]);;
new ResizeArray([1; 2; 3;]);;
----^^^^^^^^^^^
C:\Temp\stdin(5,5): error FS0033: The type 'Microsoft.FSharp.Collections.ResizeArray<_>' expects 1 type argument(s) but is given 0
Run Code Online (Sandbox Code Playgroud)