Cela échoue
string temp = () => {return "test";};
avec l'erreur
Impossible de convertir l'expression lambda en type «chaîne» car il ne s'agit pas d'un type délégué
Que signifie l'erreur et comment puis-je la résoudre?
Cela échoue
string temp = () => {return "test";};
avec l'erreur
Impossible de convertir l'expression lambda en type «chaîne» car il ne s'agit pas d'un type délégué
Que signifie l'erreur et comment puis-je la résoudre?
Réponses:
Le problème ici est que vous avez défini une méthode anonyme qui renvoie a string
mais que vous essayez de l'attribuer directement à un string
. C'est une expression qui, lorsqu'elle est invoquée, produit un string
ce n'est pas directement un string
. Il doit être affecté à un type de délégué compatible. Dans ce cas, le choix le plus simple estFunc<string>
Func<string> temp = () => {return "test";};
Cela peut être fait en une ligne par un peu de conversion ou en utilisant le constructeur de délégué pour établir le type du lambda suivi d'un appel.
string temp = ((Func<string>)(() => { return "test"; }))();
string temp = new Func<string>(() => { return "test"; })();
Remarque: les deux échantillons peuvent être raccourcis à la forme d'expression qui n'a pas { 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")();
Vous essayez d'affecter un délégué de fonction à un type chaîne. Essaye ça:
Func<string> temp = () => {return "test";};
Vous pouvez maintenant exécuter la fonction ainsi:
string s = temp();
La variable "s" aura maintenant la valeur "test".
En utilisant une petite fonction d'aide et des génériques, vous pouvez laisser le compilateur déduire le type et le raccourcir un peu:
public static TOut FuncInvoke<TOut>(Func<TOut> func)
{
return func();
}
var temp = FuncInvoke(()=>"test");
Note latérale: c'est également bien car vous pouvez ensuite renvoyer un type anonyme:
var temp = FuncInvoke(()=>new {foo=1,bar=2});
vous pouvez utiliser une méthode anonyme avec argument:
int arg = 5;
string temp = ((Func<int, string>)((a) => { return a == 5 ? "correct" : "not correct"; }))(arg);
Une méthode anonyme peut renvoyer une valeur à l'aide d'un délégué func. Voici un exemple où j'ai montré comment renvoyer une valeur à l'aide d'une méthode anonyme.
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();
}
}
}
Ceci est un autre exemple utilisant C # 8 ( pourrait également fonctionner avec d'autres versions .NET prenant en charge des tâches parallèles )
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();
}
}
}