共用方式為


F# 3.0 的重大變更

本主題說明F# 編譯器的 3.0 版和語言重大的變更 Visual Studio 2012。

中斷變更的清單。

下表列出 F# 3.0 的重大變更。

中斷變更範圍

描述

縮排

F# 舊版編譯器錯誤地接收某些無效的縮排會在目前版本產生編譯錯誤。如需縮排規則的完整說明,請參閱 程式碼格式化方針 (F#)

引號、方法和結構的屬性為區域變數。

而該結構是區域變數時,若其屬性或方法在引號中就是一個錯誤。F# 的舊版允許這個行為。

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

在這個需求。若要解決,請建立區域變數的複本,,如下列範例所示:

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

相等的不適當 Null

在舊版中,您可以比較 Null 值使用"="運算子不論是否為型別的適當或不正確的值。一個適當的 null 是型別允許 null 值,一個不適當的 null 不是這個型別的有效值。目前的行為會回傳 NullReferenceException ,當您嘗試使用"="運算子去比較不適當的null,如下列程式碼所示。

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

註解和字串

在舊版中,一個右邊的註解語彙基元*) 在使用""") 的三個以引號括住的字串會被剖析成字串的一部分。在目前的版本中,這個語彙基元剖析成結尾註解字元。因此,下列程式碼,以前被接受,會導致目前版本的錯誤:

(* """ *)
Let x = 1

如需詳細資訊,請參閱字串 (F#)

具有不同的 getter 和 setter 型別的屬性。

在 F# 中的舊版中,有一些 F# 編譯器不正確地允許的 getter 和 setter 的方法 (例如: 沒有相符的型別,int型別的getter和string型別的 setter。在 F# 3.0,則編譯器會回報宣告這類錯誤。