在 F# 中,如何模式匹配可为空<DateTime>与空?



(真的很困惑(。

请假设我有一个从WCF服务下载的访问:

type Visit = {
tservice : Nullable<DateTime>
}

以及由访问组成的访问阵列。假设数组中的一些访问具有非null的tservice,而其他访问具有null的tsservice值,那么tservice模式如何与null匹配?

即此操作失败:,

let fillSchedule (v:Visits[]) =
v |> Array.iter ( fun f -> 
match f.tservice with
| System.Nullable<DateTime>  -> tservice IS null, do something
| _ -> tservice is NOT null,  do something

)

提前感谢。

Nullable不是F#类型,它来自更广泛的.NET,因此不可能有与之匹配的模式。您可以检查它的.HasValue属性,看看它是否有值:

if f.tservice.HasValue
then tservice is NOT null, do something with f.tservice.Value
else tservice IS null, do something

或者,您可以通过Option.ofNullable将其转换为Option,并在结果上进行模式匹配:

match Option.ofNullable f.tservice with
| Some v -> ...
| None -> ...

如果你必须与将Nullable推送到你身上的.NET代码进行互操作,恐怕这是你能做的最好的事情了。但是,如果您自己控制代码库,我建议您首先使用Option而不是Nullable。它可以进行模式匹配,并且在Option模块中有一些漂亮的函数可以使用它。


最后,如果你真的真的需要使用Nullable,但也真的想在上面进行模式匹配,你可以制作自己的匹配器:

let (|Null|NotNull|) (n: Nullable<_>) =
if n.HasValue then NotNull n.Value else Null
// Usage:    
match f.tservice with
| Null -> ...
| NotNull v -> ...

相关内容

最新更新