Comme vous l'avez mentionné, vous devez créer une instance de délégué:
let ch = new MouseButtonEventHandler(fun obj args ->
printfn "Click!")
Ensuite, vous pouvez utiliser ch
en tant qu'argument à AddHandler
ou RemoveHanlder
. La raison en est que la valeur de la fonction F # n'est réellement représentée en tant que type de délégué. Il a son propre type, qui n'est pas un délégué (voir aussi another SO discussion). Vous pouvez voir la différence si vous regardez les types de F # interactive (ou VS IntelliSense):
> (fun (o:obj) (a:MouseButtonEventArgs) -> printfn "Click!")
val it : obj -> MouseButtonEventArgs -> unit = (...)
> new MouseButtonEventHandler(fun o a -> printfn "Click!")
val it : MouseButtonEventHandler = (...)
Ce qui peut être source de confusion est que F # permet également la conversion implicite de valeur de la fonction lambda à un type délégué compatible lorsque vous appelez un méthode, mais cela ne fonctionne que lorsque vous donnez une fonction lambda directement comme argument (je pense):
fe.MouseLeftButtonDown.AddHandler(fun obj args ->
printfn "Click!")
une autre raison pour laquelle vous avez encore besoin de délégués en F # est que les délégués ont une sémantique de comparaison bien définies (ils sont comparé comme tout autre type de référence). Pour les fonctions, la spécification F # ne dit pas quand elles sont égales.
Si vous ne souhaitez pas supprimer le gestionnaire, vous pouvez utiliser Ajouter. 'fe.MouseLeftButtonDown.Add (clickedEventHandler)' – gradbot