Zrušení změn v F# 3.0

Toto téma popisuje nebezpečně změny kompilátoru a jazyka F# provedené ve verzi 3.0 pro vydání aplikace Visual Studio 2012.

Seznam nebezpečných změn

Následující tabulka vypisuje nebezpečné změny v jazyce F# 3.0.

Oblast nebezpečné změny

Description

Odsazení

Některé nesprávné odsazení, které bylo chybně přijato předchozí verzí kompilátoru jazyka F# způsobuje v aktuální verzi chybu při překladu.Úplný popis pravidel odsazení naleznete v tématu Kód formátování pokyny (F#).

Nabídky, metody a vlastnosti struktur, které jsou místními proměnnými

Nyní je chybou volat vlastnost nebo metodu struktury v nabídce, je-li tato struktura místní proměnnou.Předchozí verze jazyka F# toto chování umožňovaly.

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

Chcete-li tento požadavek obejít, vytvořte kopii místní proměnné, jak ukazuje následující příklad:

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

Rovnost nesprávných hodnot null

V předchozích verzí bylo možné porovnávat hodnoty null za pomocí operátoru = bez ohledu na to, zda byly správnou či nesprávnou hodnotu typu.Správná hodnota null je hodnota null, kterou typ umožňuje; nesprávná hodnota null není platnou hodnotou typu.Současným chováním je vyvolání výjimky NullReferenceException při pokusu o použití operátoru = pro porovnání nesprávných hodnot null, jak ukazuje následující kód.

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

Komentáře a řetězce

V předchozích verzích byl uzavírací token komentáře *) v trojnásobně uvozeném řetězci (řetězci používajícím """) analyzován jako součást řetězce.V současné verzi je token analyzován jako znak uzavření komentáře.Následující kód, který byl dříve přijat, bude proto dojít k chybě v aktuální verzi:

(* """ *)
Let x = 1

Další informace naleznete v tématu Řetězce (F#).

Vlastnosti, které mají různé typy metod get a set.

V dřívějších verzích jazyka F# kompilátor F# nesprávně povoloval metodám get a set mít typy, které se neshodovaly (například metoda get měla typ int a metoda set typ string).V jazyce F# 3.0 nahlásí kompilátor takovou deklaraci jako chybu.