我想做这样的事情:
let clickedEventHandler = fun args -> printfn "Click!"fe.MouseleftbuttonDown.AddHandler( clickedEventHandler)...fe.MouseleftbuttonDown.RemoveHandler(clickedEventHandler)
这样做的正确方法是什么?
解决方法 正如您已经提到的,您需要创建一个委托实例:let ch = new MousebuttonEventHandler(fun obj args -> printfn "Click!")
然后你可以使用ch作为AddHandler或RemoveHanlder的参数.原因是,F#函数值实际上并未表示为任何委托类型.它有自己的类型,不是委托(参见another SO discussion).如果查看F#in@R_502_6704@ctive(或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#还允许在调用方法时从lambda函数值隐式转换为兼容的委托类型,但是只有在直接将lambda函数作为参数时才会起作用(我认为):
fe.MouseleftbuttonDown.AddHandler(fun obj args -> printfn "Click!")
您仍然需要F#中的委托的另一个原因是委托具有明确定义的比较语义(它们与任何其他引用类型进行比较).对于函数,F#规范没有说明它们何时相等.
总结以上是内存溢出为你收集整理的silverlight – F#:添加和删除事件处理程序全部内容,希望文章能够帮你解决silverlight – F#:添加和删除事件处理程序所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)