次の方法で共有


null 値

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

F# 9 より前の null 値

通常、NULL 値は、値または変数に対して F# では使用されません。 ただし、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 型を使用できます。 F# option 型では、null ではなく、オブジェクトがない場合 None オプション値を使用します。 オプション値 Some(obj) は、オブジェクトがある場合に obj オブジェクトと共に使用します。 詳細については、「オプションの」を参照してください。 Some xの場合でも、xnullである場合には、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 値は、Unchecked.defaultofを呼び出す Array.zeroCreateを使用する場合など、他の方法でも生成できます。 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."

F# 9 以降の null 値

F# 9 では、値として null できる参照型を処理するための追加の機能が言語に追加されています。 これらは既定でオフになっています。有効にするには、次のプロパティをプロジェクト ファイルに配置する必要があります。

<Nullable>enable</Nullable>

これにより、--checknulls+フラグ が F# コンパイラに渡され、ビルドの NULLABLEプリプロセッサ ディレクティブ が設定されます。

null 値の許容を明示的にオプトインするには、型宣言に新しい構文のサフィックスを付ける必要があります。

type | null

バー記号 | は構文内で論理 OR の意味を持ち、ベースとなる型と null 許容参照という 2 つの分離された型セットの和集合を構築します。 これは、F# 判別共用体の複数のケースを宣言するために使用されるのと同じ構文上のシンボルです。type AB = A | B は、Aまたは Bのいずれかの意味を持ちます。

null 許容注釈 | null は、参照型が通常使用されるすべての場所で使用できます。

  • 和集合型、レコード型、およびカスタム型のフィールド。
  • 既存の型への型エイリアス。
  • ジェネリック型の型アプリケーション。
  • バインディング、パラメーター、または戻り値の型を許可する明示的な型注釈。
  • メンバー、プロパティ、フィールドなどのオブジェクト プログラミングコンストラクトへの注釈を入力します。
type AB = A | B
type AbNull = AB | null

type RecordField = { X: string | null }
type TupleField = string * string | null

type NestedGenerics = { Z : List<List<string | null> | null> | null }

バー シンボル | には、構文的なあいまいさにつながる可能性がある F# のその他の使用法があります。 このような場合は、null 注釈付き型をかっこで囲む必要があります。

// Unexpected symbol '|' (directly before 'null') in member definition
type DUField = N of string | null

同じ型を一対の ( ) 括弧で包むと、問題が解決されます。

type DUField = N of (string | null)

パターン マッチングで使用する場合、| は異なるパターン マッチング句を分離するために使用されます。

match x with
| ?: string | null -> ...

このスニペットは、実際には、最初に string 型に対して型テストを行い、次に null を処理するための別の句を持つコードと同じです。

match x with
| ?: string 
| null -> ...

重要

相互運用性のために、追加の null 関連機能が言語に追加されました。 F# 型モデリングで | null を使用することは、不足している情報を示す慣用的なものではありません。その目的のために、オプションを使用します (前述のように)。 スタイル ガイドで null 関連の 規則 の詳細を確認します。

関連項目