F# 定义委托

F# 定义委托,f#,delegates,F#,Delegates,我对下面的代码有点困惑,为什么最后两次尝试定义处理程序(委托)都不起作用 //this works let serializer_setting = new JsonSerializerSettings(Error = fun (sender:obj) (args:Serialization.ErrorEventArgs) -> ()) //this doesnt let err_handler1 (sender:obj) (args:Serialization.ErrorEventAr

我对下面的代码有点困惑,为什么最后两次尝试定义处理程序(委托)都不起作用

//this works
let serializer_setting = new JsonSerializerSettings(Error = fun (sender:obj) (args:Serialization.ErrorEventArgs) -> ())

//this doesnt
let err_handler1 (sender:obj) (args:Serialization.ErrorEventArgs) = ()
let serializer_setting1 = new JsonSerializerSettings(Error = err_handler1)

//neither this
let err_handler2 = fun (sender:obj) (args:Serialization.ErrorEventArgs) -> ()
let serializer_setting2 = new JsonSerializerSettings(Error = err_handler2)
他们不是一模一样吗

编辑

我也试过这个

 type Delegate = delegate of obj * ErrorEventArgs -> Unit
 let err_handler1 (sender:obj) (args:Serialization.ErrorEventArgs) = ()
 let serializer_setting1 = new JsonSerializerSettings(Error = new Delegate(err_handler1))
但这给了我以下的错误

Error   1   This expression was expected to have type
System.EventHandler<Serialization.ErrorEventArgs>    
but here has type
Delegate
错误1此表达式应具有类型
System.EventHandler
但这里有一种类型
代表
编辑2 如果我这样做,从下面的Fyodor中获取线索

let serializer_setting1 = new JsonSerializerSettings(Error = System.EventHandler<Serialization.ErrorEventArgs>(err_handler1))
let serializer\u setting1=new JsonSerializerSettings(Error=System.EventHandler(err\u handler1))

它是有效的,这也是有意义的-但是我仍然不明白为什么我使用委托的方法不起作用。

后面的两个例子是F函数,它们实际上不是普通的.NET委托

//this works
let serializer_setting = new JsonSerializerSettings(Error = fun (sender:obj) (args:Serialization.ErrorEventArgs) -> ())

//this doesnt
let err_handler1 (sender:obj) (args:Serialization.ErrorEventArgs) = ()
let serializer_setting1 = new JsonSerializerSettings(Error = err_handler1)

//neither this
let err_handler2 = fun (sender:obj) (args:Serialization.ErrorEventArgs) -> ()
let serializer_setting2 = new JsonSerializerSettings(Error = err_handler2)
但是,为了与.NET的其余部分实现互操作性,当F#编译器发现F#函数是预期的类型时,它会将F#函数转换为兼容的委托类型

在第一个示例中,
Error
必须是委托,因此F#编译器可以推断它必须执行转换

在后两个示例中,编译器推断函数的类型,而不考虑它们的使用方式,因为F#编译器只在一次从上到下的过程中解释代码

当编译器到达尝试将函数分配给
Error
的表达式时,函数的类型已经不正确


有关F#中委托的更多信息,请参阅。

您忘记了手动转换是可能的:
Error=EventHandler(err#u handler1)
您的
委托与
EventHandler
的类型不同。我如何实现这一点(使我的委托成为同一类型)?您没有<代码>事件处理程序
已存在。你不能重新定义它。