我有一个用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
答案 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)
,这是一种无法手动注释任何值的类型!