f# - 使用部分应用程序在 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
解决方案
那是因为System.Func
是一个委托。
当您将 lambda 函数传递给 时add_MessageReceived
,lambda 会隐式转换为System.Func
.
但在其他情况下,您需要显式进行转换:
let x = System.Func<_, _> (fun msg -> processMsg msg)
helper.client.add_MessageReceived x
推荐阅读
- wordpress - 您能帮我处理这个具有多个 301 重定向的 301 重定向正则表达式代码吗?会按顺序评估吗?
- ios - RX 按钮点击处理实际上是如何实现的?
- azure-devops - 获取/修改 Azure DevOps Services 中的付费用户数和配额
- c - 使用 malloc 作为双指针
- android - Framework7 和 Android:图标在浏览器中呈现,但不在设备上
- amazon-web-services - Terraform - 输出 ec2 实例 ID 到调用 shell 脚本
- r - 生成两个日期之间的周年日期序列
- node.js - 有没有办法从 nodejs 服务器取消 Apple 订阅?
- kubernetes - Kubernetes 节点与主节点断开连接
- javascript - 即使有匹配项,while 循环中的正则表达式 exec 也会返回 null