c# - 在 F# 中实现 C# 事件处理程序

标签 c# events f# interop

我有一个用 C# 编写的接口(interface),定义如下:

public interface IWidget
{
    object Evaluate();
    event EventHandler Invalidated;
}

当我尝试在 F# 中实现此接口(interface)时,我查看了 F# 认为 IWidget 接口(interface)是什么(通过将鼠标悬停在它上面),然后我看到了

type IWidget = 
    interface
        member Evaluate : unit -> obj
    end

它似乎完全忽略了 Invalidated 事件...这是 F# 的已知问题吗?如果是,是否有任何解决方法?在实现我的 F# 版本的 IWidget 时,我可以只在 IWidget 部分之外实现这个事件吗? f# 如此糟糕地处理“事件”关键字似乎真的很讨厌......

更新: 在进一步摆弄之后,工作室然后说了这样的话:

'没有为 IWidget.remove_Invalidate(value:EventHandler):unit 提供实现'

然后,当我添加这些方法时,整个事情看起来像这样:

interface IWidget with
    member w.Evaluate() = new obj()
    member w.add_Invalidated(value:EventHandler) = ()
    member w.remove_Invalidated(value:EventHandler) = ()
end

它编译得很好,尽管工具提示仍然说 IWidget 的唯一成员是 Evaluate()...似乎 F#(或至少是 IDE)处理这些东西的方式真的很奇怪...

另一项更新: 根据 IDE 中的工具提示,[] 标记允许将事件编译为 CLI 元数据事件,方法是将其转换为一对 add_/remove_ 方法……仅供引用,供与我一样困惑的任何人使用曾是。简而言之,实现这两种方法或使用该标记都可以正常工作,尽管 IWdiget 接口(interface)的工具提示 View 没有提及 Invalidate 事件,并且只有在编译器抛出错误,仍然是一个明显的错误并且非常困惑。对于任何好奇的人,以下代码都可以正常工作:

let invalidated = new DelegateEvent<System.EventHandler>()

interface IWidget with
    member w.Evaluate() = new obj()
    [<CLIEvent>]
    member w.Invalidated = invalidated.Publish
end

感谢大家的帮助!

最佳答案

F# does support events .

例如:

let invalidated = new DelegateEvent<System.EventHandler>()

[<CLIEvent>]
member this.Invalidated = invalidated.Publish

关于c# - 在 F# 中实现 C# 事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3251608/

相关文章:

c# - SQL Server 变量(最大)

swift - 在 F# 中继承多个类

c# - 这是一个好的 REST URI 吗?

c# - 信号量无一异常(exception)地溢出到最大值

c# - 如何在 Rider 中启用拼写检查?

javascript - 如何避免我的事件在 javascript (node.js) 上累积?

events - Weld 中的 JavaEE CDI : Generic Events?

javascript - 当所有异步处理程序完成时执行 javascript 函数

f# - List.max<'T> 是如何工作的?

f# - Async.StartImmediate vs Async.RunSynchronously