F#中Nullable的赋值

时间:2014-08-22 13:23:13

标签: f#

我正在使用一个库(WPF扩展工具包),其中几乎每个属性都是Nullable<'T>。这使得在任何地方都不得不写下来一直很痛苦

checkbox.IsChecked <- new Nullable<bool>(true)

在C#中,这将隐式转换。有没有办法模仿F#中的相同行为?我发现的最简洁的选择是

checkbox.IsChecked <- unbox true

但这似乎在紧密循环中产生了更多的开销(微优化,但仍然如此),甚至还不如C#简洁。

3 个答案:

答案 0 :(得分:6)

new关键字是可选的,类型推断将处理泛型参数:

open System
checkbox.IsChecked <- Nullable true

如果你不想每次都输入十次额外的击键,你可以像CarstenKönig所描述的那样声明一个函数,但声明不需要像他那样冗长:

let nl x = Nullable x
checkbox.IsChecked <- nl true

答案 1 :(得分:5)

看看这个问题:Nullablle<>'s and "null" in F# - 您可以这样做以通用方式包装任何值:

let nl (x : 'a) = 
   System.Nullable<'a> (x)

只需像这样使用它:

checkbox.IsChecked <- nl true;

答案 2 :(得分:3)

一个解决方法是定义前缀运算符:

let inline (!) (x: ^a) = ((^a or ^b) : (static member op_Implicit : ^a -> ^b) x)

checkbox.IsChecked <- !true

请注意,这会影响取消引用运算符。如果这是一个问题,你可以选择一个不同的符号。