2010-07-15 18 views
6

ho un'interfaccia, scritto in C#, definita come questo:implementazione C# EventHandlers in F #

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

Quando provo ad implementare questa interfaccia in F #, guardo quello F # pensa l'interfaccia iWidget è (da in bilico il mio mouse su di esso), e vedo

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

sembra ignorare l'evento Invalidato tutto ... questo è un problema noto con F # e se è così c'è un modo di lavorare intorno ad esso? Quando implemento la mia versione F # di IWidget, posso implementare questo evento al di fuori della sezione IWidget o cosa? Sembra davvero brutto che f # gestisce la parola "evento" così male ...

UPDATE: Dopo ulteriori armeggiare intorno, in studio è stato poi dicendo cose come:

'alcuna implementazione è stato dato per IWidget.remove_Invalidate (valore: EventHandler): unità'

poi, quando ho aggiunto questi metodi modo che il tutto sembrava:

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

è compilato bene, anche se il tooltip stava ancora dicendo l'unico membro del iWidget era valu ate() ... sembra che il modo in cui F # (o almeno l'IDE) gestisce questa roba sia davvero fasullo ...

UN ALTRO AGGIORNAMENTO: Secondo il suggerimento nell'IDE, il tag [] consente un evento da compilare come evento di metadati CLI, trasformandolo in una coppia di metodi add_/remove_ ... solo FYI per chiunque fosse confuso da questo come lo ero io. In breve, l'implementazione di questi due metodi o l'utilizzo di tale tag funziona bene, sebbene il fatto che la vista tooltip dell'interfaccia IWdiget manchi di menzione dell'evento Invalidate e la necessità di implementare tale evento viene notata solo quando il compilatore lancia un errore, è ancora un bug chiaro ed è piuttosto confuso. Per chiunque curioso, il seguente codice funziona bene:

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

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

Grazie per tutto l'aiuto di tutti!

risposta

8

F# does support events.

Ad esempio:

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

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

interessante ... il mio compilatore è stato poi dire cose come: 'alcuna implementazione è stato dato per IWidget.remove_Invalidate (valore: EventHandler): Unità' e quando li ho aggiunto così sembrava: interface IWidget with member w.Evaluate() = new obj() member w.add_Invalidated(value:EventHandler) =() member w.remove_Invalidated(value:EventHandler) =() end compilato bene, anche se il tooltip stava ancora dicendo che l'unico membro di IWidget era Evaluate() ... sembra che il modo in cui f # (o almeno l'IDE) gestisce questa roba è davvero avvincente ... – lvilnis

+0

** ignorare sono un noob in questa roba di formattazione – lvilnis

+0

Sfortunatamente, non è possibile avere una nuova riga nei commenti. – SLaks