2013-03-20 9 views
13

Mi manca qualcosa o non è possibile restituire un valore da una funzione lambda, come ..C# Lambda Funzioni: dati che ritornano

Object test =() => { return new Object(); };

o

string test =() => { return "hello"; };

I ottenere un errore di compilazione "Impossibile convertire l'espressione lambda in" string "perché non è un tipo delegato".

È come se questa sintassi assegni la lambda piuttosto che il risultato della lambda, cosa che non mi aspettavo. Posso ottenere la funzionalità desiderata assegnando la funzione a Func e chiamandola per nome, ma è l'unico modo?

Per favore no "perché dovresti farlo?" riguardo il mio esempio.

Grazie in anticipo!

+0

@IAbstract La tua modifica ha completamente cambiato la domanda così l'ho arrotolata indietro. –

+0

@KonradRudolph: strano ... Stavo * tentando * di rimuovere le ultime 2 righe. Grazie per averlo capito. :) – IAbstract

+0

Possibile duplicato di [Come restituire valore con metodo anonimo?] (Http://stackoverflow.com/questions/10520892/how-to-return-value-with-anonymous-method) – Roflo

risposta

32

È possibile ma si sta tentando di assegnare un lambda a string. - È necessario invoke lambda:

Func<string> f =() => { return "hello"; }; 
string test = f(); 

Il messaggio di errore in realtà dice tutto:

Impossibile convertire espressione lambda al tipo 'stringa'

... questo è esattamente il problema qui.

Se si desidera richiamare la lambda inline, ma in realtà: perché? - lo puoi fare anche tu, devi solo prima renderlo esplicito a un delegato:

string test = (new Func<string>(() => { return "hello"; }))(); 
+1

Assegnazione di un'espressione lambda a un la variabile implicitamente tipizzata non funzionerà. – sloth

+0

@DominicKexel Ah, molto vero. –

+0

Ah è stato veloce. Stavo solo modificando la mia domanda quando hai risposto. È possibile richiamare la lambda inline piuttosto che assegnare a Func ? Grazie! –