如何使用重载的显式转换运算符?

时间:2016-06-02 15:28:18

标签: f#

我有一个用C#定义的类型:

struct F {
    public static explicit operator F(long value) {}
    public static explicit operator long(F value) {}
    public static explicit operator F(double value) {}
    public static explicit operator double(F value) {}
    // more conversion operators
}

在F#中,如果我想从长时间创建它,我找到的唯一方法是:

let l = F.op_Explicit 3L

我尝试创建内联函数以使其更好:

let inline f a = F.op_Explicit a

但这并没有编译。我也尝试过成员约束:

let inline f (x:^a) = (F: (static member op_Explicit : ^a -> F) x) 

这也没有编译。

是否可以定义一个函数或运算符来选择正确的重载?

另一方面,它在相反的方向上运作良好:

let f = someF |> int64 // calls the right conversion operator

1 个答案:

答案 0 :(得分:6)

对单个具体类型具有成员约束无效;但是,这可能适合你:

let inline f (x:^a) : F =
    let inline g x = ((^b or ^c):(static member op_Explicit : ^b -> ^c) x)
    g x

这是更通用的类型f : ^a -> F when ( ^a or F) : (static member op_Explicit : ^a -> F),这是一种无法手动注释任何值的类型!