let inline heterogenousAddBad(value1 : ^T when ^T : (static member (+) : ^T * ^U -> ^T), value2 : ^U) = value1 + value2
let inline heterogenousAdd(value1 : ^T when (^T or ^U) : (static member (+) : ^T * ^U -> ^T), value2 : ^U) = value1 + value2
let inline heterogenousAdd2(value1 : ^T when ^U : (static member (+) : ^T * ^U -> ^T), value2 : ^U) = value1 + value2
[<EntryPoint>]
let main argv =
let a = heterogenousAdd(5, 6) //work
printfn "%A" a
let b = heterogenousAddBad(5, 6) //not work
printfn "%A" b
let c = heterogenousAdd2(5, 6) //work
printfn "%A" c
0
为什么对于int,float和其他基本类型需要使用in(^ T或^ U)?用户定义的带有运算符(+)的类型可以与功能heterogenousAddBad一起使用,而基本类型则不能。 Try it