Це не вдається
string temp = () => {return "test";};
з помилкою
Неможливо перетворити лямбда-вираз у тип "рядок", оскільки він не є типом делегата
Що означає помилка і як я можу її усунути?
Це не вдається
string temp = () => {return "test";};
з помилкою
Неможливо перетворити лямбда-вираз у тип "рядок", оскільки він не є типом делегата
Що означає помилка і як я можу її усунути?
Відповіді:
Проблема тут полягає в тому, що ви визначили анонімний метод, який повертає a, stringале намагаєтеся призначити його безпосередньо a string. Це вираз, який при виклику створює a 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 = () => "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);
Анонімний метод може повернути значення за допомогою делегата функції. Ось приклад, коли я показав, як повернути значення за допомогою анонімного методу.
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();
}
}
}
Це ще один приклад використання C # 8 ( також може працювати з іншими версіями .NET, що підтримують паралельні завдання )
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();
}
}
}