如何解决在F#中,如何将Nullable <DateTime>与Null模式匹配?
(真的很困惑)。
请假设我从WCF服务下载了“访问”,如下:
type Visit = {
tservice : Nullable<DateTime>
}
和一个由Visits组成的Visit数组。假设数组中的某些访问的tservice为非null,而其他访问的tservice为null,那么如何将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
将其转换为Option.ofNullable
并在结果上进行模式匹配:
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 -> ...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。