2010-07-15 16 views
6

Ich habe eine Schnittstelle, in C# geschrieben, wie folgt definiert:Implementierung von C# Eventhandler in F #

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

Wenn ich versuche, diese Schnittstelle in F # zu implementieren, ich sehe, was F # denkt, dass der IWidget Schnittstelle (durch meine Maus darüber) schwebt, und ich sehe

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

es scheint ganz das Invalidated-Ereignis zu ignorieren ... ist dies ein bekanntes Problem mit F # und wenn ja, ist es eine Möglichkeit, um es zu arbeiten? Kann ich bei der Implementierung meiner F # -Version von IWidget dieses Ereignis außerhalb des IWidget-Abschnitts implementieren oder was? Es scheint wirklich böse, dass f # behandelt das „Ereignis“ keyword so schlecht ...

UPDATE: Nach mehr rund um das Hantieren, Studio dann sagen Dinge wie:

‚keine Implementierung wurde für IWidget.remove_Invalidate gegeben (Wert: Eventhandler): Einheit‘

dann hinzugefügt, wenn ich diese Methoden so das ganze aussah:

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

es gut zusammengestellt, auch wenn der Tooltip noch das einzige Mitglied IWidget sagte bewer war ate() ... es scheint so, als ob F # (oder zumindest die IDE) dieses Zeug handhabt ist wirklich verrückt ...

ANOTHER UPDATE: Laut dem Tooltip in der IDE, erlaubt das [] -Tag ein Ereignis, das als ein CLI-Metadatenereignis kompiliert wird, indem es in ein Paar von add_/remove_-Methoden umgewandelt wird ... nur FYI für jeden, der so verwirrt war wie ich. Kurz gesagt, entweder die Implementierung dieser beiden Methoden oder die Verwendung dieses Tags funktionieren gut, obwohl die Tatsache, dass die QuickInfo-Ansicht der IWdiget-Schnittstelle keine Erwähnung des Invalidate-Ereignisses enthält, und die Notwendigkeit der Implementierung eines solchen Ereignisses nur bemerkt wird, wenn der Compiler ein Fehler, ist immer noch ein klarer Fehler und ist ziemlich verwirrend. Für alle Neugierigen funktioniert folgender Code gut:

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

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

Danke für die Hilfe allen!

Antwort

8

F# does support events.

Zum Beispiel:

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

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

interessant ... mein Compiler dann sagen Dinge wie: ‚keine Implementierung für IWidget.remove_Invalidate gegeben wurde (Wert: Eventhandler): Einheit‘ und wenn ich hinzugefügt, um sie so sah es aus wie: interface IWidget with member w.Evaluate() = new obj() member w.add_Invalidated(value:EventHandler) =() member w.remove_Invalidated(value:EventHandler) =() end es kompiliert gut, sogar tho der Tooltipp war immer noch das einzige Mitglied von IWidget war Evaluate() ... es scheint wie der Weg f # (oder zumindest die IDE) behandelt dieses Zeug ist wirklich screwy ... – lvilnis

+0

** ignoriere ich bin ein noob bei diesem Formatierungskram – lvilnis

+0

Leider können Sie in Kommentaren keine Zeilenumbrüche haben. – SLaks