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!
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** ignoriere ich bin ein noob bei diesem Formatierungskram – lvilnis
Leider können Sie in Kommentaren keine Zeilenumbrüche haben. – SLaks