Как вернуть значение анонимным методом?


Это не

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

ошибка

не удается преобразовать лямбда-выражение В тип 'string', потому что это не тип делегата

что означает ошибка и как ее можно устранить?

5 67

5 ответов:

проблема здесь в том, что вы определили анонимный метод, который возвращает string но пытаются присвоить его непосредственно к string. Это выражение, которое при вызове создает string это не прямо a string. Он должен быть назначен совместимому типу делегата. В этом случае самый простой выбор -Func<string>

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

это может быть сделано в одной строке с помощью немного кастинга или с помощью конструктора делегата, чтобы установить тип лямбда, за которым следует вызов.

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

Примечание: оба образца могут быть сокращены до формы выражения, в которой отсутствует { return ... }

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

вы пытаетесь назначить делегировать функции строкового типа. Попробуйте это:

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

теперь вы можете выполнить функцию так:

string s = temp();

переменная "s "теперь будет иметь значение"test".

используя небольшую вспомогательную функцию и дженерики, вы можете позволить компилятору вывести тип и немного сократить его:

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

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

Примечание стороны: это также приятно, как вы тогда можете вернуть анонимный тип:

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

вы можете использовать анонимный метод с аргументом :

int arg = 5;

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

анонимный метод может возвращать значение с помощью делегата func. Вот пример, где я показал как вернуть значение с помощью анонимного метода.

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