次の方法で共有


F# 3.0 での互換性に影響する変更点

このトピックでは、Visual Studio 2012 リリースについて F# コンパイラおよび F# 言語のバージョン 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 は、型に有効な値ではありません。現在の動作では、次のコードで示すように、= 演算子を使用して不適切な null を比較しようとすると、NullReferenceException がスローされます。

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

コメントおよび文字列

以前のバージョンでは、三重引用符で囲まれた文字列 (""" を使用する文字列) 内にある終了コメント トークン *) は、文字列の一部として解析されていました。現在のバージョンでは、このトークンは終了コメント文字として解析されます。したがって、前に指定できる次のコードは、現在のバージョンのエラーを生成します:

(* """ *)
Let x = 1

詳細については、「文字列 (F#)」を参照してください。

get アクセス操作子と set アクセス操作子の型が異なるプロパティ

以前のバージョンの F# の F# コンパイラでは、型が一致しない get アクセス操作子メソッドと set アクセス操作子メソッドを誤って許可していました (たとえば、int 型の get アクセス操作子と文字列型の set アクセス操作子)。F# 3.0 では、コンパイラはこのような宣言をエラーとして報告します。