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