2012-05-09 17 views

risposta

95

Il problema qui è che è stato definito un metodo anonimo che restituisce un string ma sta tentando di assegnarlo direttamente a string. È un'espressione che quando invocato produce uno string non è direttamente un string. Deve essere assegnato a un tipo di delegato compatibile. In questo caso la scelta è facile Func<string>

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

Questo può essere fatto in una linea da un bit di fusione o utilizzando il costruttore delegato per stabilire il tipo di lambda seguita da una chiamata.

string temp = ((Func<string>)(() => { return "test"; }))(); 
string temp = new Func<string>(() => { return "test"; })(); 

Nota: Entrambi i campioni potrebbe subire un cortocircuito alla forma di espressione che manca la { return ... }

Func<string> temp =() => "test"; 
string temp = ((Func<string>)(() => "test"))(); 
string temp = new Func<string>(() => "test")(); 
+0

Grazie. Quindi non c'è modo di fare tutto su una riga (incluso l'assegnazione di una stringa)? Il valore che voglio ("test", che in realtà è una variabile nella vita reale) si trova all'interno di un altro lambda, quindi perdo le scope se provo a definire come hai sopra. – 4thSpace

+0

@ 4thSpace può essere fatto in una riga con un cast malvagio. Ho aggiornato la mia risposta per mostrare il modo in cui – JaredPar

+0

O in questo caso, solo 'Func temp =() =>" test ";'. – Gabe

12

Si sta tentando di assegnare una funzione di delegato ad un tipo stringa. Prova questo:

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

È ora possibile eseguire la funzione così:

string s = temp(); 

La "s" variabile avranno ora il "test" di valore.

+1

Questo non viene compilato: "Impossibile assegnare un'espressione lambda a una variabile locale implicitamente tipizzata" –

+0

@Dave: interessante, non conoscevo tale limite. Aggiornato, grazie! –

6

Usando un po 'di funzione di supporto e di farmaci generici si può lasciare che il compilatore dedurre il tipo, e accorciare un po':

public static TOut FuncInvoke<TOut>(Func<TOut> func) 
{ 
    return func(); 
} 

var temp = FuncInvoke(()=>"test"); 

Nota a margine: questo è anche bello come poi è in grado di restituire un anonimo tipo:

var temp = FuncInvoke(()=>new {foo=1,bar=2}); 
+0

Tecnica interessante. Questo aggiunge sovraccarico di runtime, o è tutto in fase di compilazione? – ToolmakerSteve

3

è possibile utilizzare il metodo anonimo con argomento:

int arg = 5; 

string temp = ((Func<int, string>)((a) => { return a == 5 ? "correct" : "not correct"; }))(arg); 
+0

Puoi, ma per favore spiega come questa è una risposta alla domanda. – ToolmakerSteve

1

Un metodo ananomico può restituire un valore utilizzando la funzione deligata. Ecco l'esempio in cui ho mostrato come restituire un valore usando il metodo ananomous.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApp1 
{ 
    class Program 
    { 


     static void Main(string[] args) 
     { 
      Func<int, int> del = delegate (int x) 
       { 
        return x * x; 

       }; 

      int p= del(4); 
      Console.WriteLine(p); 
      Console.ReadLine(); 
     } 
    } 
} 
Problemi correlati