Wie funktioniert diese Typanmerkung und warum funktioniert die andere nicht?

Bitte erklären Sie die Magie hinterdrawShape Funktion. 1) Warum es überhaupt funktioniert - ich meine, wie es das @ nenDraw member, 2) warum es sein mussinline?

type Triangle() =
    member x.Draw() = printfn "Drawing triangle"

type Rectangle() =
    member x.Draw() = printfn "Drawing rectangle"

let inline drawShape (shape : ^a) =
    (^a : (member Draw : unit->unit) shape)

let triangle = Triangle()
let rect = Rectangle()

drawShape triangle
drawShape rect

Und die nächste Ausgabe ist - ist es möglich zu schreibendrawShape -Funktion mit Parametertyp-Annotation wie unten? Ich habe festgestellt, dass es genau die gleiche Signatur hat wie das erste, aber ich kann den Körper nicht vervollständigen.

let inline drawShape2 (shape : ^a when ^a : (member Draw : unit->unit)) =
    ...

Danke im Voraus

Antworten auf die Frage(2)

Ihre Antwort auf die Frage