共用方式為


Null 值 (F#)

本主題描述 F# 中 null 值的用法。

null 值

F# 中通常不使用 null 值來做為值或變數。 不過在某些情況下,null 會顯示為異常值。 除非將 AllowNullLiteral 屬性套用至型別,否則如果以 F# 定義型別,則不允許將 null 當成一般值使用。 如果是以其他 .NET 語言來定義型別,則可以使用 null 值,因此在與這類型別相互操作時,您的 F# 程式碼可能會遇到 null 值。

針對以 F# 定義且只在 F# 中使用的型別,使用 F# 程式庫直接建立 null 值的唯一方式是使用 Unchecked.defaultofArray.zeroCreate。 不過,對於從其他 .NET 語言使用的 F# 型別,或者如果該型別要與不是以 F# 語言 (例如 .NET Framework) 撰寫的 API 一起使用,就可能會出現 null 值。

當參考變數可能與另一個 .NET 語言的可能 null 值一起使用時,您可以使用 F# 中的 option 型別。 如果沒有物件,則使用選項值 None 搭配 F# 型別 option,而不是 null。 如果有物件,則使用選項值 Some(obj) 搭配物件 obj。 如需詳細資訊,請參閱選項 (F#)

null 關鍵字是 F# 語言中的有效關鍵字,搭配 .NET Framework API 或以其他 .NET 語言撰寫的 API 使用時必須使用此關鍵字。 有兩種情況可能需要使用 null 值:當呼叫 .NET API 並傳遞 null 值做為引數時,以及當解譯 .NET 方法呼叫的傳回值或輸出參數時。

若要將 null 值傳遞至 .NET 方法,只需在呼叫程式碼中使用 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 語言互通,則可能必須針對 null 輸入參數加入檢查,並擲回 ArgumentNullException,就如同 C# 或 Visual Basic 程式碼一樣。

您可以使用下列程式碼來檢查是否有任意值為 null。

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

請參閱

參考

搜尋運算式 (F#)

其他資源

值 (F#)