[英]Implementing C# EventHandlers in F#
我有一個用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
謝謝各位的幫助!
F#確實支持事件 。
例如:
let invalidated = new DelegateEvent<System.EventHandler>()
[<CLIEvent>]
member this.Invalidated = invalidated.Publish
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.