Questo fallisce
string temp = () => {return "test";};
con l'errore
Impossibile convertire l'espressione lambda nel tipo "stringa" perché non è un tipo delegato
Cosa significa l'errore e come posso risolverlo?
Questo fallisce
string temp = () => {return "test";};
con l'errore
Impossibile convertire l'espressione lambda nel tipo "stringa" perché non è un tipo delegato
Cosa significa l'errore e come posso risolverlo?
Risposte:
Il problema qui è che hai definito un metodo anonimo che restituisce a string
ma stai cercando di assegnarlo direttamente a a string
. È un'espressione che quando invocata produce un string
non è direttamente a string
. Deve essere assegnato a un tipo di delegato compatibile. In questo caso la scelta più semplice èFunc<string>
Func<string> temp = () => {return "test";};
Questa operazione può essere eseguita in una riga mediante un po 'di casting o utilizzando il costruttore delegato per stabilire il tipo di lambda seguito da una chiamata.
string temp = ((Func<string>)(() => { return "test"; }))();
string temp = new Func<string>(() => { return "test"; })();
Nota: entrambi i campioni potrebbero essere cortocircuitati nella forma di espressione che non ha l'estensione { return ... }
Func<string> temp = () => "test";
string temp = ((Func<string>)(() => "test"))();
string temp = new Func<string>(() => "test")();
Func<string> temp = () => "test";
.
string temp = new Func<string>(() => "test")();
Stai tentando di assegnare un delegato di funzione a un tipo di stringa. Prova questo:
Func<string> temp = () => {return "test";};
È ora possibile eseguire la funzione in questo modo:
string s = temp();
La variabile "s" ora avrà il valore "test".
Usando una piccola funzione di aiuto e generici puoi lasciare che il compilatore deduca il tipo e accorciarlo un po ':
public static TOut FuncInvoke<TOut>(Func<TOut> func)
{
return func();
}
var temp = FuncInvoke(()=>"test");
Nota a margine: anche questo è bello in quanto puoi restituire un tipo anonimo:
var temp = FuncInvoke(()=>new {foo=1,bar=2});
puoi usare il metodo anonimo con argomento:
int arg = 5;
string temp = ((Func<int, string>)((a) => { return a == 5 ? "correct" : "not correct"; }))(arg);
Un metodo anonimo può restituire un valore utilizzando un delegato func. Ecco un esempio in cui ho mostrato come restituire un valore utilizzando un metodo anonimo.
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();
}
}
}
Questo è un altro esempio che utilizza C # 8 ( potrebbe funzionare anche con altre versioni .NET che supportano attività parallele )
using System;
using System.Threading.Tasks;
namespace Exercise_1_Creating_and_Sharing_Tasks
{
internal static class Program
{
private static int TextLength(object o)
{
Console.WriteLine($"Task with id {Task.CurrentId} processing object {o}");
return o.ToString().Length;
}
private static void Main()
{
const string text1 = "Welcome";
const string text2 = "Hello";
var task1 = new Task<int>(() => TextLength(text1));
task1.Start();
var task2 = Task.Factory.StartNew(TextLength, text2);
Console.WriteLine($"Length of '{text1}' is {task1.Result}");
Console.WriteLine($"Length of '{text2}' is {task2.Result}");
Console.WriteLine("Main program done");
Console.ReadKey();
}
}
}