null 許容値型

"Null 許容値型" Nullable<'T> は、null になることもある任意の構造体型を表します。 これは、効率上の理由から、整数のようなこの種の型を null 値で表すことを選択することがあるライブラリやコンポーネントとやり取りする場合に役立ちます。 このコンストラクトを支える基となる型は System.Nullable<T> です。

構文

Nullable<'T>
Nullable value

宣言と値の割り当て

F# での Null 許容値型の宣言は、ラッパーのような型を宣言する場合と同じです。

open System

let x = 12
let nullableX = Nullable<int> x

ジェネリック型パラメーターを省略し、型の推定で解決することもできます。

open System

let x = 12
let nullableX = Nullable x

Null 許容値型に割り当てるには、明示的にする必要もあります。 F# で定義された Null 許容値型の暗黙的な変換はありません。

open System

let mutable x = Nullable 12
x <- Nullable 13

null を割り当てる

null を Null 許容値型に直接割り当てることはできません。 代わりに、Nullable() を使用してください。

let mutable a = Nullable 42
a <- Nullable()

これは、Nullable<'T> に適切な値として null がないためです。

メンバーへの引き渡しと割り当て

メンバーと F# 値を操作する場合の主な違いは、メンバーを操作する場合は、Null 許容値型を暗黙的に推定できることです。 Null 許容値型を入力として受け取る次のメソッドについて考えてみましょう。

type C() =
    member _.M(x: Nullable<int>) = x.HasValue
    member val NVT = Nullable 12 with get, set

let c = C()
c.M(12)
c.NVT <- 12

前の例では、メソッド M12 を渡すことができます。 12 を自動プロパティ NVT に割り当てることもできます。 入力を Null 許容値型として構築することができ、それがターゲット型と一致する場合、F# コンパイラにより、そのような呼び出しまたは割り当ては暗黙的に変換されます。

Null 許容値型インスタンスを調べる

使用できる値を表すための一般化されたコンストラクトである Option とは異なり、Null 許容値型はパターン マッチングでは使用されません。 代わりに、if 式を使用して、HasValue プロパティを確認する必要があります。

基になる値を取得するには、次のように HasValue チェックの後に Value プロパティを使用します。

open System

let a = Nullable 42

if a.HasValue then
    printfn $"{a} is {a.Value}"
else
    printfn $"{a} has no value."

Null 許容演算子

算術演算や比較などの Null 許容値型に対する操作では、Null 許容演算子の使用が必要になる場合があります。

FSharp.Linq 名前空間の変換演算子を使用して、ある Null 許容値型を別の型に変換できます。

open System
open FSharp.Linq

let nullableInt = Nullable 10
let nullableFloat = Nullable.float nullableInt

null 非許容の適切な演算子を使用してプリミティブ型に変換することもできますが、値がない場合は、例外が発生するリスクがあります。

open System
open FSharp.Linq

let nullableInt = Nullable 10
let nullableFloat = Nullable.float nullableInt

printfn $"value is %f{float nullableFloat}"

HasValueValueを確認するための省略形として Null 許容演算子を使用することもできます。

open System
open FSharp.Linq

let nullableInt = Nullable 10
let nullableFloat = Nullable.float nullableInt

let isBigger = nullableFloat ?> 1.0
let isBiggerLongForm = nullableFloat.HasValue && nullableFloat.Value > 1.0

?> の比較により、左側が Null 許容かどうかが確認されます。これは、値がある場合にのみ成功します。 これは、それに続く行と同じです。

関連項目