使用部分应用程序订阅 F# 中的 c# 事件
Subscribing to c# Events in F# With Partial Applications
经过几个小时的猛烈抨击,我终于开始工作了。现在我正试图理解为什么。
这是来自 c# 库的事件定义:
internal readonly AsyncEvent<Func<SocketMessage, Task>> _messageReceivedEvent = new AsyncEvent<Func<SocketMessage, Task>>();
唯一有效的方法是直接传入 (fun -> ):
helper.client.add_MessageReceived
(fun msg ->
processMsg msg)
无法参数化:
let x =
(fun msg ->
processMsg msg)
helper.client.add_MessageReceived x
我最初尝试只传递 processMsg 函数。它看起来像正确的签名:
helper.client.add_MessageReceived processMsg
那是因为 System.Func
是 delegate。
当您将 lambda 函数传递给 add_MessageReceived
时,lambda 会隐式转换为 System.Func
。
但在其他情况下,您需要明确地进行转换:
let x = System.Func<_, _> (fun msg -> processMsg msg)
helper.client.add_MessageReceived x
经过几个小时的猛烈抨击,我终于开始工作了。现在我正试图理解为什么。
这是来自 c# 库的事件定义:
internal readonly AsyncEvent<Func<SocketMessage, Task>> _messageReceivedEvent = new AsyncEvent<Func<SocketMessage, Task>>();
唯一有效的方法是直接传入 (fun -> ):
helper.client.add_MessageReceived
(fun msg ->
processMsg msg)
无法参数化:
let x =
(fun msg ->
processMsg msg)
helper.client.add_MessageReceived x
我最初尝试只传递 processMsg 函数。它看起来像正确的签名:
helper.client.add_MessageReceived processMsg
那是因为 System.Func
是 delegate。
当您将 lambda 函数传递给 add_MessageReceived
时,lambda 会隐式转换为 System.Func
。
但在其他情况下,您需要明确地进行转换:
let x = System.Func<_, _> (fun msg -> processMsg msg)
helper.client.add_MessageReceived x