Isso falha
string temp = () => {return "test";};
com o erro
Não é possível converter a expressão lambda para o tipo 'string' porque não é um tipo delegado
O que significa o erro e como posso resolvê-lo?
Isso falha
string temp = () => {return "test";};
com o erro
Não é possível converter a expressão lambda para o tipo 'string' porque não é um tipo delegado
O que significa o erro e como posso resolvê-lo?
Respostas:
O problema aqui é que você definiu um método anônimo que retorna a, stringmas está tentando atribuí-lo diretamente a a string. É uma expressão que, quando invocada, produz um string, não é diretamente um string. Ele precisa ser atribuído a um tipo de delegado compatível. Neste caso, a escolha mais fácil éFunc<string>
Func<string> temp = () => {return "test";};
Isso pode ser feito em uma linha por um pouco de conversão ou usando o construtor delegado para estabelecer o tipo de lambda seguido por uma invocação.
string temp = ((Func<string>)(() => { return "test"; }))();
string temp = new Func<string>(() => { return "test"; })();
Nota: Ambas as amostras podem ser encurtadas para a forma de expressão que não possui o { 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")();
Você está tentando atribuir um delegado de função a um tipo de string. Experimente isto:
Func<string> temp = () => {return "test";};
Agora você pode executar a função desta forma:
string s = temp();
A variável "s" agora terá o valor "teste".
Usando um pouco de função auxiliar e genéricos, você pode deixar o compilador inferir o tipo e encurtá-lo um pouco:
public static TOut FuncInvoke<TOut>(Func<TOut> func)
{
return func();
}
var temp = FuncInvoke(()=>"test");
Observação lateral: isso também é bom, pois você pode retornar um tipo anônimo:
var temp = FuncInvoke(()=>new {foo=1,bar=2});
você pode usar o método anônimo com o argumento:
int arg = 5;
string temp = ((Func<int, string>)((a) => { return a == 5 ? "correct" : "not correct"; }))(arg);
Um método anônimo pode retornar um valor usando um delegado func. Aqui está um exemplo em que mostrei como retornar um valor usando um 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();
}
}
}
Este é outro exemplo usando C # 8 ( também pode funcionar com outras versões .NET que suportam tarefas paralelas )
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();
}
}
}