簡體   English   中英

在F#中實現C#EventHandlers

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM