gpt4 book ai didi

f# - 定义委托(delegate)

转载 作者:行者123 更新时间:2023-12-03 00:31:35 26 4
gpt4 key购买 nike

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

//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

编辑2如果我这样做,请从下面的费奥多尔那里获取线索

let serializer_setting1 = new JsonSerializerSettings(Error = System.EventHandler<Serialization.ErrorEventArgs>(err_handler1))

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

最佳答案

后两个示例是 F# 函数,它们实际上不是普通的 .NET 委托(delegate)。

但是,出于与 .NET 其余部分的互操作性的目的,F# 编译器在发现这是预期类型时会将 F# 函数转换为兼容的委托(delegate)类型。

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

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

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

参见the documentation有关 F# 中委托(delegate)的更多信息。

关于f# - 定义委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33370392/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com