我有一个用C#编写的接口,定义如下:
public interface IWidget
{
object Evaluate();
event EventHandler Invalidated;
}
当我尝试在F#中实现此接口时,我会看看F#认为IWidget接口是什么(通过将鼠标悬停在它上面),我看到了
type IWidget =
interface
member Evaluate : unit -> obj
end
它似乎完全忽略了Invalidated事件......这是F#的一个已知问题,如果是这样有什么方法可以解决它?在实现我的F#版本的IWidget时,我可以在IWidget部分之外实现此事件或者什么?似乎非常讨厌f#处理“event”关键字这么差......
更新: 在进一步摆弄之后,工作室随后说了些什么:
'没有给出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_方法......对于那些因为我而感到困惑的人来说,仅限FYI是。简而言之,实现这两个方法或使用该标记工作正常,尽管IWdiget接口的工具提示视图没有提及Invalidate事件,并且只有在编译器抛出时才会注意到实现此类事件的必要性。错误,仍然是一个明显的错误,并且非常令人困惑。对于任何好奇的人,以下代码都可以正常工作:
let invalidated = new DelegateEvent<System.EventHandler>()
interface IWidget with
member w.Evaluate() = new obj()
[<CLIEvent>]
member w.Invalidated = invalidated.Publish
end
感谢所有人的帮助!
答案 0 :(得分:8)
例如:
let invalidated = new DelegateEvent<System.EventHandler>()
[<CLIEvent>]
member this.Invalidated = invalidated.Publish