Как уже упоминалось, вам необходимо создать экземпляр делегата:
let ch = new MouseButtonEventHandler(fun obj args ->
printfn "Click!")
Затем вы можете использовать ch
как аргумент AddHandler
или RemoveHanlder
. Причина в том, что значение функции F # фактически не представлено в виде любого типа делегата. У этого есть свой тип, который не является делегатом (см. Также another SO discussion). Вы можете увидеть разницу, если вы посмотрите на типы в F # интерактивные (или VS IntelliSense):
> (fun (o:obj) (a:MouseButtonEventArgs) -> printfn "Click!")
val it : obj -> MouseButtonEventArgs -> unit = (...)
> new MouseButtonEventHandler(fun o a -> printfn "Click!")
val it : MouseButtonEventHandler = (...)
Что может сбивать с толку то, что F # также позволяет неявное преобразование из значения функции лямбда к совместимому типу делегата при звонке метод, однако это работает только тогда, когда вы даете функцию лямбда непосредственно в качестве аргумента (я думаю):
fe.MouseLeftButtonDown.AddHandler(fun obj args ->
printfn "Click!")
еще одна причина, почему вы все еще нуждаются делегатов в F # является то, что делегаты имеют четко определенную семантику сравнения (они по сравнению с любыми другими ссылочными типами). Для функций спецификация F # не говорит, когда они равны.
Если вы не беспокоитесь об удалении обработчика, вы можете использовать Add. 'fe.MouseLeftButtonDown.Add (clickedEventHandler)' – gradbot