2010-07-15 67 views
6

我有一個接口,用C#編寫,定義爲這樣:在F#實現C#事件處理

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

當我試圖實現在F#這個界面,我看看F#認爲iWidget的接口(通過我徘徊鼠標的話),我看到

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

這似乎完全忽略失效的事件......這是一個已知問題F#如果是的話有沒有什麼辦法來解決呢?在實現我的F#版本的IWidget時,我可以在IWidget部分之外實現這個事件嗎?看來真是可惡的是F#處理「事件」關鍵字這麼差......

UPDATE: 進一步擺弄周圍,工作室則說這樣的話之後:

「不執行被賦予了IWidget.remove_Invalidate(值:事件處理):單位」

然後,當我說這些方法,使得整個事情看上去像:

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

它編譯罰款,即使提示還在說iWidget的唯一成員是Evalu ate()...似乎F#(或者至少IDE)處理這個東西的方式真的很棘手......

其他更新: 根據IDE中的工具提示,[]標籤允許事件通過將其轉換爲一對add_/remove_方法來編譯爲CLI元數據事件...僅供參考,因爲這與我一樣困惑。簡而言之,無論是實現這兩種方法還是使用該標籤都可以正常工作,儘管IWdiget接口的工具提示視圖沒有提及任何Invalidate事件,並且只有在編譯器拋出一個事件時纔會注意到實現此類事件的必要性錯誤,仍然是一個明確的錯誤,相當混亂。對於任何好奇的人,下面的代碼工作正常:

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

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

感謝所有幫助大家!

回答

8

F# does support events

例如:

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

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

有趣......我的編譯器,然後說這樣的話: 「沒有執行被賦予了IWidget.remove_Invalidate(價值:事件處理):單位」 ,當我加入他們所以它看起來像: interface IWidget with member w.Evaluate() = new obj() member w.add_Invalidated(value:EventHandler) =() member w.remove_Invalidated(value:EventHandler) =() end 它編譯得很好,甚至tho工具提示仍然說IWidget的唯一成員是Evaluate()...它似乎像f#(或至少IDE)處理這些東西的方式是真的扭曲... – lvilnis 2010-07-15 00:44:17

+0

**無視我是這個格式化東西的菜鳥 – lvilnis 2010-07-15 00:49:08

+0

不幸的是,你不能在評論中有換行符。 – SLaks 2010-07-15 00:50:18