我有一个用 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
感谢大家的帮助!
最佳答案
例如:
let invalidated = new DelegateEvent<System.EventHandler>()
[<CLIEvent>]
member this.Invalidated = invalidated.Publish
关于c# - 在 F# 中实现 C# 事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3251608/