使用部分应用程序订阅 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.Funcdelegate

当您将 lambda 函数传递给 add_MessageReceived 时,lambda 会隐式转换为 System.Func

但在其他情况下,您需要明确地进行转换:

let x = System.Func<_, _> (fun msg -> processMsg msg)
helper.client.add_MessageReceived x