Modifiche importanti in F# 3.0

Questo argomento descrive le modifiche sostanziali nella versione 3.0 del compilatore F# e della lingua per la versione Visual Studio 2012.

Elenco di modifiche sostanziali

Nella tabella seguente sono elencate le modifiche sostanziali apportate in F# 3.0.

Area di modifica sostanziale

Descrizione

Rientro

Alcuni rientri errati che sono stati erroneamente accettati da versioni precedenti del compilatore F# generano un errore di compilazione nella versione corrente.Per una descrizione completa delle regole di indentazione, vedere Linee guida per la formattazione del codice (F#).

Citazioni, metodi e proprietà delle strutture che sono variabili locali

Adesso, è un errore chiamare un metodo o una proprietà di una struttura in una citazione quando tale struttura è una variabile locale.Le versioni precedenti di F# consentivano questo comportamento.

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

Per ovviare a questo requisito, creare una copia della variabile locale, come illustrato nel seguente esempio:

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

Uguaglianza di valori Null impropri

Nelle versioni precedenti, è possibile confrontare i valori null utilizzando l' operatore = indipendentemente dal fatto che siano valori appropriati o impropri di un tipo.Un valore appropriato è un valore null che il tipo consente; un null improprio non è un valore valido per il tipo.Il comportamento corrente prevede di generare una NullReferenceException quando si tenta di utilizzare l' operatore = per confrontare valori Null impropri, come mostra il seguente codice.

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

Commenti e stringhe

Nelle versioni precedenti, un token di chiusura del commento *) in una stringa tra virgolette triple (una stringa contenente """) era analizzato come parte di una stringa.Nella versione corrente, il token viene analizzato come un carattere di chiusura del commento.Pertanto, il codice seguente, in precedenza veniva accettato, verrà generato un errore nella versione corrente:

(* """ *)
Let x = 1

Per ulteriori informazioni, vedere Stringhe (F#).

Proprietà che hanno tipi diversi di getter e setter.

Nelle versioni precedenti di F#, Il compilatore F# consentiva, scorrettamente, metodi getter e setter per avere tipi non associati (ad esempio, un getter di tipo int e un setter di tipo string).In F# 3.0, il compilatore segnala una dichiarazione come errore.