在 F# 中,如何将 Nullable<DateTime> 与 Null 进行模式匹配?
In F#, how to pattern match Nullable<DateTime> against Null?
(真糊涂)
请假设我有一个从 WCF 服务下载的访问:
type Visit = {
tservice : Nullable<DateTime>
}
和一个由 Visits 组成的 Visit 数组。假设数组中的某些访问具有非空 tservice,而其他访问具有空 tservice 值,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 -> ...
(真糊涂)
请假设我有一个从 WCF 服务下载的访问:
type Visit = {
tservice : Nullable<DateTime>
}
和一个由 Visits 组成的 Visit 数组。假设数组中的某些访问具有非空 tservice,而其他访问具有空 tservice 值,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 -> ...