2009-02-15 16 views
6

Non ho esperienza in F # ma ho alcune righe di codice di test in C# per un framework che ho realizzato che ho bisogno di riscrivere in F #.Eventi e delegati in F #

Qualsiasi aiuto sarebbe apprezzato.

bar.Ready += new Agent.ReadyHandler(bar_Ready);    

    static void bar_Ready(string msg) 
    {  
     Console.WriteLine(msg.body); 
    } 

risposta

4

Ho giocato molto con questo e questo è il codice che funziona.

bar.add_Ready(fun msg -> Console.WriteLine(msg)) 

Non so quanto sia teoricamente corretto ma funziona correttamente.

Qualcuno può confermare è corretto?

+1

Ciao, questo è corretto. Sfortunatamente, F # non si comporta bene per tutti i delegati. Penso che se il vostro delegato seguisse il modello standard di .NET (XyzEventHandler prendendo oggetto e XyzEventArgs), allora le soluzioni descritte sopra funzionerebbero anche. –

+0

BTW: se sei l'autore del tipo di delegato e desideri utilizzarlo solo da F #, puoi prendere in considerazione l'utilizzo di funzioni anziché delegati. –

+0

@Tomas Petricek: il framework stesso da cui proviene il delegato è in C#. – Ali

6

Prova questo -

bar.Ready.AddHandler(new Agent.ReadyHandler (fun sender msg -> System.Console.WriteLine(msg))) 
+0

o anche più breve: bar.Ready.AddHandler (messaggio mittente divertente -> System.Console.WriteLine (msg)) –

+0

Nota che i delegati in F # non aggiungono i metodi 'BeginInvoke' e 'EndInvoke'. –

+1

Lo stesso si ottiene: "L'evento" Ready ha un tipo di delegato non standard e deve essere accessibile utilizzando i metodi espliciti add_Ready e remove_ready per l'evento. ", Qualche idea sul perché? – Ali

9

Giusto per chiarire - la versione più breve dovrebbe essere correttamente:

bar.Ready.Add(fun msg -> System.Console.WriteLine(msg)) 

Perché F # non converte automaticamente le funzioni lambda ai delegati - ma non v'è un metodo Aggiungi che accetta una funzione. Questo può quindi essere scritto ancora più semplice in questo modo:

bar.Ready.Add(System.Console.WriteLine) 

Perché F # consente di utilizzare i membri .NET come funzioni di prima classe.

+1

Viene visualizzato l'errore: l'evento "Pronto ha un tipo di delegato non standard e deve essere accessibile utilizzando i metodi espliciti add_Ready e remove_ready per l'evento. – Ali