Как вернуть значение анонимным методом?
Это не
string temp = () => {return "test";};
ошибка
не удается преобразовать лямбда-выражение В тип 'string', потому что это не тип делегата
что означает ошибка и как ее можно устранить?
5 ответов:
проблема здесь в том, что вы определили анонимный метод, который возвращает
string
но пытаются присвоить его непосредственно кstring
. Это выражение, которое при вызове создаетstring
это не прямо astring
. Он должен быть назначен совместимому типу делегата. В этом случае самый простой выбор -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(); } } }