F#返回默认值的自定义运算符

时间:2015-06-15 15:31:06

标签: f# operator-overloading

我在F#中定义了一个自定义运算符,如下所示:

static member (&?) value defaultValue =
    if value = null then
        defaultValue
    else
        value

运算符在类型中定义,应该被调用 在以下场景中:
我正在使用WMI检索有关系统处理器的信息 现在我想得到VoltageCaps属性,但由于那可能是null,我想在这种情况下分配一个默认值。

let voltage = (m.["VoltageCaps"] &? (0 :> obj))

Visual Studio告诉我“类型'obj'不支持运算符'&?'”

我在这里遗漏了什么或操作员本身是否有问题?

1 个答案:

答案 0 :(得分:4)

您的运算符采用obj类型的arg,因此您应将其定义为独立函数,而不是类型成员。

let (&?) (value:obj) (defaultValue:'a) =
    match value with
    | null -> defaultValue
    | _ -> unbox value

现在你可以这样做:

let voltage = m.["VoltageCaps"] &? 0

我将其更改为模式匹配null,因为它比通用等式具有更好的性能。