My actual use case has nothing to do with DateTime. I want to call multiple overloaded methods defined on a builder struct.
They are call path dependent, return a modified this struct. So I can't pass the builder as two arguments with two independent generic types.
Have I overlooked something straightforward, or should I file a bug report?
open System
[<Struct>]
type MyDateTime =
member x.Subtract(_: TimeSpan) = x
member x.Subtract(_: DateTime) = TimeSpan(1L)
let inline f< ^DT when
^DT: (member Subtract: TimeSpan -> ^DT) and
^DT: (member Subtract: DateTime -> TimeSpan)
>(dt: ^DT, ts: TimeSpan, dt1: DateTime) =
let mutable dt = dt
dt <- (^DT: (member Subtract: TimeSpan -> ^DT) dt, ts)
(^DT: (member Subtract: DateTime -> TimeSpan) dt, dt1)
printfn "%A" <| f(MyDateTime(), TimeSpan(1L), DateTime(1L))
printfn "%A" <| f(DateTime.UtcNow, TimeSpan(1L), DateTime(1L))
(F# 7 SRTP improvements are not available on SharpLab, but that's not the point.)