我正在使用一个库(WPF扩展工具包),其中几乎每个属性都是Nullable<'T>
。这使得在任何地方都不得不写下来一直很痛苦
checkbox.IsChecked <- new Nullable<bool>(true)
在C#中,这将隐式转换。有没有办法模仿F#中的相同行为?我发现的最简洁的选择是
checkbox.IsChecked <- unbox true
但这似乎在紧密循环中产生了更多的开销(微优化,但仍然如此),甚至还不如C#简洁。
答案 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
请注意,这会影响取消引用运算符。如果这是一个问题,你可以选择一个不同的符号。