Principales cambios en F# 3.0

Este tema describe cambios importantes en la versión 3.0 del compilador de F# y del lenguaje para la versión Visual Studio 2012.

Lista de cambios importantes

En la siguiente tabla se enumeran los cambios importantes ocurridos en F# 3.0.

Área de cambio importante

Descripción

Sangría

Si las las versiones anteriores del compilador de F# erroneamente aceptaban algunos sangrados incorrectos, en la versión actual dichos sangrados incorrectos producen error de compilación.Para obtener una descripción completa de las reglas de sangría, consulte Instrucciones de formato de código (F#).

Comillas, métodos y propiedades de estructuras que son variables locales

Ahora es un error llamar a una propiedad o a un método de una estructura entre comillas cuando esa estructura es una variable local.Las versiones anteriores de F# permitían este comportamiento.

[<Struct>]
type S =
   member this.Valid = true
let check () =
    let mutable s = S()
    <@ s.Valid @> // Error

Para evitar este requisito, cree una copia de la variable local, como se muestra en el siguiente ejemplo:

let check () =
    let s = S()
    <@ 
        let s = s
        s.Valid 
    @>

Igualdad para nulos inadecuados

En versiones anteriores, se podían comparar valores nulos mediante el operador = independientemente de que fueran valores adecuados o inadecuados de un tipo.Un valor nulo adecuado es un valor nulo que permite el tipo; un valor nulo inadecuado no es un valor válido para el tipo.El comportamiento actual es producir una NullReferenceException cuando se intente usar el operador = para comparar nulos inadecuados, como muestra el siguiente código.

let a : int ref = Unchecked.defaultof<_>
let main() =
    printfn "%A" (a = a)
main()

Comentarios y cadenas

En versiones anteriores, una cadena de cierre de comentarios *) en una cadena con tres delimitadores (una cadena que utiliza """) se analizaba como una parte de una cadena.En la versión actual, dicho token se analiza como un carácter de cierre de comentario.Por consiguiente, el código siguiente, que se ha aceptado previamente, generará un error en la versión actual:

(* """ *)
Let x = 1

Para obtener más información, vea Cadenas (F#).

Propiedades que tienen distintos tipos de getter y el setter.

En versiones anteriores de F#, el compilador de F# permitía incorrectamente que los métodos getter y setter tuvieran tipos que no concordaran (por ejemplo, un getter de tipo int y un setter de tipo string).En F# 3.0, el compilador señala dicha declaración como un error.