2012-05-09 11 views

Respuesta

95

El problema aquí es que ha definido un método anónimo que devuelve un string pero está intentando asignarlo directamente a string. Es una expresión que cuando se invoca produce un string, no es directamente un string. Debe asignarse a un tipo de delegado compatible. En este caso la opción más fácil es Func<string>

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

Esto se puede hacer en una línea por un poco de colada o mediante el constructor delegado para establecer el tipo de la lambda seguida de una invocación.

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

Nota: Ambas muestras podría provocar un cortocircuito a la forma de expresión que carece de la { return ... }

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

Gracias. Entonces, ¿no hay manera de hacer todo en una línea (incluida la asignación de cadena)? El valor que quiero ("prueba", que en realidad es una variable en la vida real) está dentro de otra lambda, así que pierdo alcance si trato de definir lo que tengo arriba. – 4thSpace

+0

@ 4thSpace se puede hacer en una línea con algún mal lanzamiento. Actualicé mi respuesta para mostrar el camino – JaredPar

+0

O en este caso, simplemente 'Func temp =() =>" test ";'. – Gabe

12

Está intentando asignar un delegado función de un tipo de cadena. Prueba esto:

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

Ahora se puede ejecutar la función de esta manera:

string s = temp(); 

La "s" variable será ahora tienen la "prueba" de valor.

+1

Esto no compila: "No se puede asignar la expresión lambda a una variable local implícitamente tipada" –

+0

@Dave: Interesante, no sabía acerca de esa limitación. Actualizado, gracias! –

6

Con un poco de función auxiliar y genéricos puede dejar que el compilador inferir el tipo y acortarlo un poco:

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

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

nota: esto también es agradable ya que entonces es capaz de devolver un anónimo tipo:

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

Técnica interesante. ¿Esto agrega sobrecarga en tiempo de ejecución, o todo está en tiempo de compilación? – ToolmakerSteve

3

puede utilizar el método en el anonimato con el argumento:

int arg = 5; 

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

Puede, pero explique cómo esta es una respuesta a la pregunta. – ToolmakerSteve

1

Un método ananomous puede devolver un valor usando el func deligate. Aquí está el ejemplo donde he mostrado cómo devolver un valor usando un método anónimo.

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(); 
     } 
    } 
} 
Cuestiones relacionadas