2011-06-16 14 views
6

Usando F # 2.0 y FSI Tengo el siguiente:La inferencia de tipos y nueva - Seguramente me estoy siendo estúpido

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 

ahora, por supuesto que puedo hacer:

let baz = new List<TypeOItemsInXs>(xs)//why? 

Ahora hay algo ¿Puedo hacerlo razonablemente? ¿Por qué tengo que elegir entre inferencia de tipo de trabajo o código libre de advertencias (si 'Lista' es desechable, recibes una advertencia de que debes usar 'nuevo' para ser explícito al respecto).

¿Alguna solución alternativa? ¿Es esto un error o algo?

Respuesta

13

También puede usar la inferencia de tipos con un comodín _:

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

let bar = new List<_>(xs) 

Por cierto, para distinguir F lista # y .NET List<T> contenedor, F # ha cambiado el nombre .NET List<T> a ResizeArray<T>, que está en Microsoft.FSharp.Collections y esto espacio de nombres se abre por defecto:

let bar2 = new ResizeArray<_>(xs) 
8

Yin Zhu respuesta es correcta, me gustaría añadir un detalle. En F # puede llamar a los constructores de .NET con o sin la palabra clave new. Si se omite new, no es necesario agregar el parámetro genérico, pero si usa new, entonces debe agregar un parámetro genérico, incluso si permite que la inferencia de tipo haga el trabajo utilizando un comodín _.

Por lo tanto, se puede decir:

> ResizeArray([1; 2; 3;]);; 
val it : System.Collections.Generic.List<int> = seq [1; 2; 3] 

o

> new ResizeArray<_>([1; 2; 3;]);; 
val it : ResizeArray<int> = seq [1; 2; 3] 

pero no:

> 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 
+0

OMI esto es aún mejor. 'new' es superfluo. – Daniel

+0

también, creo que se debe usar nuevo con la palabra clave use, cuando está creando un IDisposable; de ​​lo contrario, se debe omitir – Alex

+1

sí, mi problema es que tengo un tipo desechable y omitir el nuevo da una advertencia. Si agrego lo nuevo, entonces, como señala Yin Zhu, puedo usar un comodín. Es extraño que el lenguaje sea asimétrico: S –

Cuestiones relacionadas