当与C#库进行交互时,我发现自己想要使用C#的空合并运算符,这两个运算符都是Nullable结构和引用类型.
有可能在F#中使用单个重载操作符来近似,这样可以在适当的情况下嵌套?
是的,使用这个SO答案“
Overload operator in F#”中发现的一些小黑客.
在编译时,对于使用(‘a Nullable,a) – > a或(‘a when’a:null,’a) – >的正确的重载’一个单一的运算符可以内联.甚至(‘a选项’a) – > ‘可以投入更多的灵活性.
为了提供更接近c#操作符的行为,我使默认参数’一个懒惰,所以它的源不被调用,除非原始值为空.
例:
let value = Something.PossiblyNullReturned() |?? lazy new SameType()
执行:
NullCoalesce.fs [Gist]:
//https://gist.github.com/jbtule/8477768#file-nullcoalesce-fs type NullCoalesce = static member Coalesce(a: 'a option,b: 'a Lazy) = match a with Some a -> a | _ -> b.Value static member Coalesce(a: 'a Nullable,b: 'a Lazy) = if a.HasValue then a.Value else b.Value static member Coalesce(a: 'a when 'a:null,b: 'a Lazy) = match a with null -> b.Value | _ -> a let inline nullCoalesceHelper< ^t,^a,^b,^c when (^t or ^a) : (static member Coalesce : ^a * ^b -> ^c)> a b = ((^t or ^a) : (static member Coalesce : ^a * ^b -> ^c) (a,b)) let inline (|??) a b = nullCoalesceHelper<NullCoalesce,_,_> a b