如何在f#中匹配Nullable Date参数

时间:2019-03-19 21:40:19

标签: f# nullable

正在学习F#,找不到答案...我想处理Nullable参数(原始C#中的DateTime?)为null的情况,但出现错误“ Nullable没有null作为适当的值”。正确的方法是什么?

let addIfNotNull(ht:Hashtable, key:string, value:Nullable<DateTime>) = 
        match value with 
        | null -> ()
        | _ -> ht.Add(key,value)
        ht  

2 个答案:

答案 0 :(得分:5)

来自https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/symbol-and-operator-reference/nullable-operators

  

可以使用System.Nullable<'T>属性从Value对象获得实际值,并且可以通过调用System.Nullable<'T>来确定HasValue对象是否具有值方法。

所以您不用match

if value.HasValue then ht.Add(key, value.Value)

您可以使用

match Option.ofNullable value with ...

或声明一些活动模式以提供帮助。

答案 1 :(得分:1)

虽然@AlexeyRomanov的答案非常有效,但如果您确实想匹配Nullable值,则可以这样定义一个活动模式:

let (|Null|Value|) (x : _ Nullable) =
    if x.HasValue then Value x.Value else Null

然后在您的函数中使用它:

let addIfNotNull (ht : Hashtable) (key : string)
                 (value : Nullable<DateTime>) =
    match value with
    | Null -> ()
    | Value dt -> ht.Add (key, dt)
    ht

我自由更改了函数的签名,因此它采用了可修改的参数;除非您有特定要求,否则通常使用curried参数而不是tupled参数。