Как сопоставить параметр Nullable Date в f # - PullRequest
3 голосов
/ 20 марта 2019

Изучая F #, не могу найти ответ на этот вопрос ... Я бы хотел обработать случай, когда параметр Nullable (DateTime? В исходном c #) равен нулю, но я получаю ошибку "Nullable не имеет нулевого значения как правильное значение ". Как правильно это сделать?

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

Ответы [ 2 ]

5 голосов
/ 20 марта 2019

С 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 голос
/ 20 марта 2019

Хотя ответ @ 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

Я позволил себе изменить подпись вашей функции, чтобы она принимала параметры карри; если у вас нет особых требований, параметры карри обычно предпочтительнее, чем параметры с кортежем.

...