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
Зачем использовать или в (^ T или ^ U) для базовых типов, таких как int, float и другие?Пользовательские типы с оператором (+) работают с функцией heterogenousAddBad, но базовые типы - нет. Попробуйте