F# 类型推断&;F中的新#

F# 类型推断&;F中的新#,f#,f#-interactive,F#,F# Interactive,使用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 让foo=List(xs)//工作 let bar=new List(xs)//需要类型参数“给定了类型System.Collections.Gener

使用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
让foo=List(xs)//工作
let bar=new List(xs)//需要类型参数“给定了类型System.Collections.Generic 1类型参数0”
现在我当然可以做到:

let baz = new List<TypeOItemsInXs>(xs)//why?
let baz=newlist(xs)//为什么?
现在有什么我可以合理地做的吗? 为什么我必须在工作类型推断代码和无警告代码之间进行选择(如果“列表”是一次性的,您会得到一个警告,您应该使用“新”来明确说明它)


有解决办法吗?这是一个bug还是什么?

您仍然可以使用带有通配符的类型推断:

open System.Collections.Generic
let xs = [1;2;3]

let bar = new List<_>(xs)

尹朱的回答是正确的,我想补充一个细节。在F#中,您可以使用或不使用
new
关键字调用.NET构造函数。如果省略了
new
,则无需添加泛型参数,但如果使用
new
,则必须添加泛型参数,即使您让类型推断使用通配符

因此,你可以说:

> ResizeArray([1; 2; 3;]);;
val it : System.Collections.Generic.List<int> = seq [1; 2; 3]
>调整数组大小([1;2;3;]);;
val it:System.Collections.Generic.List=seq[1;2;3]

>新的调整大小数组([1;2;3;]);;
valit:ResizeArray=seq[1;2;3]
但不是:

> 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
>新的调整大小数组([1;2;3;]);;
新的ResizeArray([1;2;3;]);;
----^^^^^^^^^^^
C:\Temp\stdin(5,5):错误FS0033:类型“Microsoft.FSharp.Collections.ResizeArray”需要1个类型参数,但被指定为0

IMO这甚至更好
new
是多余的。另外,我认为在创建IDisposable时,new应该与use关键字一起使用,否则它应该被省略。是的,我的问题是我有一个一次性类型,省略new会发出警告。如果我添加新的,那么正如尹朱指出的,我可以使用通配符。这种语言是如此的不对称,这让人感到奇怪:S
> new ResizeArray<_>([1; 2; 3;]);;
val it : ResizeArray<int> = seq [1; 2; 3]
> 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