Como essa anotação de tipo funciona e por que a outra não?

Por favor, explique a mágica por trásdrawShape função. 1) Por que funciona de verdade - quero dizer como ele chama oDraw 2) por que precisa serinline?

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

E a próxima questão é - é possível escreverdrawShape função usando anotação de tipo de parâmetro como abaixo? Descobri que ele tem exatamente a mesma assinatura que a primeira, mas não consigo concluir o corpo.

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

Desde já, obrigado.

questionAnswers(1)

yourAnswerToTheQuestion