Parece que cuando usa "dejar ... entrar" puede anular la configuración predeterminada "#light", que es que el espacio en blanco es significativo, así que supongo que eso es lo que sucede en este caso y por qué no recibe advertencia/error en el segundo caso (agregaste 'in', por lo que el compilador cree que deseas especificar el alcance explícitamente). Parece un poco raro, así que puede ser un error. Estoy seguro de que Brian del equipo F # responderá a esta duda pronto :-).
De todos modos, creo que el compilador trata de su segundo ejemplo del mismo modo (usando un más fácil de compilar ejemplo):
open System
let ar = new ResizeArray<_>() in
let rnd = new Random();
ar.Add(rnd.Next())
printfn "%A" (rnd.Next())
Usted puede obligarlo a tratarlo como lo hubiera querido si se agrega entre paréntesis y escribir algo como esto:
let ar = new ResizeArray<_>() in
(let rnd = new Random()
ar.Add(rnd.Next()))
printfn "%A" (rnd.Next())
En general, puede usar paréntesis para especificar ámbitos en cualquier lugar del programa F #. Por ejemplo, puede escribir:
let a = 1
(let a = a + 10
printfn "%d" a)
printfn "%d" a
Este ejemplo imprime "10" y luego "1". Por supuesto, esto no parece ser muy práctico, pero es útil cuando se usa la palabra clave use
que se comporta como let
, pero funciona para los objetos IDisposable
y asegura que el objeto se elimina cuando sale del ámbito (esto es como using
en C#):
let some = new Some()
(use file = new StreamReader(...)
let txt = file.ReadToEnd()
printfn "%s" txt)
doSomething() // continue, 'file' is now closed!
EDITAR: me olvidó por completo mencionar el importante bits - la primera forma de escribir el código parece más natural para mí (y utiliza plenamente los beneficios de #Light "simple" sintaxis que F # ofrece), así que lo preferiría :-).
Guau bueno. Si Brian no responde a este, debería considerar enviarlo a fsbugs @ microsoft.com. – MichaelGG
Abrí el error 4693. :) Evite "dejar ... entrar" en el código #light. – Brian