2009-09-26 10 views
9

Estoy tratando de escribir un código simple en C#, y me sale este error:mutable variable 'i' se utiliza de una manera válida.?

Error 1 The mutable variable 'i' is used in an invalid way. Mutable variables may not be captured by closures. Consider eliminating this use of mutation or using a heap-allocated mutable reference cell via 'ref' and '!' 

Código:

let printProcess = async { 
     let mutable i = 1; 
     while true do 
      System.Console.WriteLine(i);//error is here 
      i <- i + 1; 
    } 

¿Por qué no se me deja imprimir la variable?

Respuesta

17

No se puede hacer referencia a las mutables dentro de un cierre, y eso incluye construcciones tales como bloques {} y async {}.

Se puede escribir

let printProcess = async { 
     let i = ref 1 
     while true do 
      System.Console.WriteLine(!i) 
      i := !i + 1 
    } 

Ver this blog por alguna discusión.

+6

La respuesta corta de por qué tiene que ver esto es que los valores de los mutables 'están en la pila y valores 'ref' están en el montón. Dado que la pila se borrará tan pronto como sale de la función de todos los valores mutables consiguen recuperados. Ref valores por otro lado persistirán al igual que cualquier otro objeto basura recogida. –

+3

Otra forma de decirlo es que F # captura los valores, no variables. Debido a esto, la captación del valor de una variable mutable sería la misma que la captación del valor de una variable inmutable, como el valor en sí es siempre inmutable. Probablemente, este comportamiento no es lo que la gente esperaría, y por lo tanto, estaba prohibido. – Joh

Cuestiones relacionadas