F# 3.0 中的重大更改

本主题介绍中断在 F# 编译器和 Visual Studio 2012 发布的语言的 3.0 版本中更改。

重大更改的列表

下表列出在 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

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 和字符串类型的 setter)。 在 F# 3.0 中,编译器将报告如此声明为错误。