null 値

このトピックでは、F# での null 値の使用方法について説明します。

[NULL の値]

通常、F# で値または変数に null 値が使用されることはありません。 ただし、特定の状況では null が外れ値として発生します。 ある型が F# で定義されている場合、AllowNullLiteral 属性がその型に適用されている場合を除き、null は通常の値として許可されません。 他の .NET 言語で定義されている型の場合、null は指定可能な値であり、そのような型を相互運用するときに、F# コードで null 値が発生する可能性があります。

F# で定義された、厳密に F# から使用される型の場合、F# ライブラリを直接使用して null 値を作成する唯一の方法は、Unchecked.defaultof または Array.zeroCreate を使用することです。 ただし、他の .NET 言語から使用される F# 型の場合や、F# で記述されていない API (.NET Framework など) でその型を使用する場合は、null 値が発生する可能性があります。

別の .NET 言語で null 値になる可能性がある参照変数を使用する場合は、F# の option 型を使用できます。 null の代わりに F# の option 型を使用して、オブジェクトがない場合は option の値 None を使用します。 オブジェクトがある場合は、option の値 Some(obj) をオブジェクト obj と共に使用します。 詳細については、オプションに関するページを参照してください。 Some xxnull である場合も、null 値を Option にパックすることができます。 このため、値が null のときは None を使用することが重要です。

null キーワードは、F# の有効なキーワードであり、.NET Framework の API または別の .NET 言語で記述されたその他の API を使用するときに使用する必要があります。 null 値が必要になる可能性がある 2 つの状況は、.NET API を呼び出し、引数として null 値を渡す場合と、.NET メソッド呼び出しからの戻り値または出力パラメーターを解釈する場合です。

.NET メソッドに null 値を渡すには、呼び出し元のコードで null キーワードを使用するだけです。 これを次のコード例に示します。

open System

// Pass a null value to a .NET method.
let ParseDateTime (str: string) =
    let (success, res) = DateTime.TryParse(str, null, System.Globalization.DateTimeStyles.AssumeUniversal)
    if success then
        Some(res)
    else
        None

.NET メソッドから取得した null 値を解釈するには、可能であればパターン マッチングを使用します。 次のコード例は、入力ストリームの終わりを過ぎて読み取りを続けようとしたときに ReadLine から返される null 値を、パターン マッチングを使用して解釈する方法を示しています。

// Open a file and create a stream reader.
let fileStream1 =
    try
        System.IO.File.OpenRead("TextFile1.txt")
    with
        | :? System.IO.FileNotFoundException -> printfn "Error: TextFile1.txt not found."; exit(1)

let streamReader = new System.IO.StreamReader(fileStream1)

// ProcessNextLine returns false when there is no more input;
// it returns true when there is more input.
let ProcessNextLine nextLine =
    match nextLine with
    | null -> false
    | inputString ->
        match ParseDateTime inputString with
        | Some(date) -> printfn "%s" (date.ToLocalTime().ToString())
        | None -> printfn "Failed to parse the input."
        true

// A null value returned from .NET method ReadLine when there is
// no more input.
while ProcessNextLine (streamReader.ReadLine()) do ()

F# の型での null 値は、Array.zeroCreate を使用する場合などに他の方法でも生成でき、それにより Unchecked.defaultof が呼び出されます。 null 値をカプセル化した状態に保つために、このようなコードに注意する必要があります。 F# 専用のライブラリでは、すべての関数で null 値をチェックする必要はありません。 他の .NET 言語との相互運用のためのライブラリを記述する場合は、C# または Visual Basic コードの場合と同様に、null 入力パラメーターのチェックを追加し、ArgumentNullException をスローすることが必要になる場合があります。

次のコードを使用して任意の値が null かどうかを確認できます。

match box value with
| null -> printf "The value is null."
| _ -> printf "The value is not null."

関連項目