web-dev-qa-db-fra.com

Comment retourner une valeur avec une méthode anonyme?

Cela échoue

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

avec l'erreur

Impossible de convertir l'expression lambda en type 'chaîne' car ce n'est pas un type délégué

Que signifie l'erreur et comment puis-je la résoudre?

77
4thSpace

Le problème ici est que vous avez défini une méthode anonyme qui retourne un string mais tentez de l'affecter directement à un string. C'est une expression qui, lorsqu'elle est appelée, produit un string n'est pas directement un string. Il doit être affecté à un type de délégué compatible. Dans ce cas, le choix le plus facile est Func<string>

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

Cela peut être fait en une ligne par un peu de transtypage ou en utilisant le constructeur 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 sans le { return ... }

Func<string> temp = () => "test";
string temp = ((Func<string>)(() => "test"))();
string temp = new Func<string>(() => "test")();
117
JaredPar

Vous tentez d'affecter un délégué de fonction à un type de 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".

14
Dave Swersky

En utilisant une petite fonction d'assistance 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 aussi agréable, car vous pouvez alors renvoyer un type anonyme:

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

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);
4
HamidReza

ne méthode anonyme peut renvoyer une valeur en utilisant un délégué func. Voici un exemple où j'ai montré comment renvoyer une valeur en utilisant 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();
        }
    }
}
2
Debendra Dash