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!
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** ignorare sono un noob in questa roba di formattazione – lvilnis
Sfortunatamente, non è possibile avere una nuova riga nei commenti. – SLaks