首页 > 解决方案 > 使用部分应用程序在 F# 中订阅 c# 事件

问题描述

经过几个小时的猛烈抨击后,我有了这个工作。现在我试图理解为什么。

这是来自 ac# lib 的事件定义:

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

标签: f#c#-to-f#

解决方案


那是因为System.Func是一个委托

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

但在其他情况下,您需要显式进行转换:

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

推荐阅读