Task<TResult>. Ошибка инициализации

164
06 апреля 2018, 15:44
Func<int, string> func = (int p) =>
{
  return p.ToString();
};
Task<string> task = new Task<string>(func, 7);

Ошибка 1 Наиболее подходящий перегруженный метод для System.Threading.Tasks.Task<string>.Task(System.Func<string>, System.Threading.CancellationToken) имеет несколько недопустимых аргументов

Ошибка 2 Аргумент "1": преобразование типа из System.Func<int,string> в System.Func<string> невозможно

Ошибка 3 Аргумент "2": преобразование типа из int в System.Threading.CancellationToken невозможно

Как передать в функцию задания строго типизированный входной параметр типа int?

Answer 1

Состряпаем из вашей функции, принимающей один параметр, функцию без параметров:

static async Task Main(string[] args)
{
    Func<int, string> func = (int p) =>
    {
        return p.ToString();
    };
    Task<string> task = new Task<string>(() => func(7));
    task.Start();
    string r = await task;
    Console.WriteLine(r);
    Console.ReadKey();
}

Т.е. мы здесь определяем еще одну функцию (анонимную), это примерно тоже самое, что написать так:

Func<string> func2 = () => func(7);
Task<string> task = new Task<string>(func2);
Answer 2

Перегрузка с функцией и состоянием имеет следующий вид:

Task<TResult>(Func<Object, TResult>, Object)

Проблема в том, что в Func<Object, TResult> нельзя передать Func<int, string>.( Подробнее можно посмотреть в вопросе: В чем суть ковариантности и контравариантности делегатов?)

Для решения достаточно просто изменить тип делегата, на Func<Object, TResult>

Func<object, string> func = (object p) =>
{
  return p.ToString();
};
Task<string> task = new Task<string>(func, 7);
READ ALSO
Горячие клавиши в WPF

Горячие клавиши в WPF

Вот коды к игре пятнашки, нужно чтобы при нажатии ctrl + z происходил откат перемещения до самого первого, но как это сделать средствами wpf не знаю...

205
Доступ к камере из различных мест приложения

Доступ к камере из различных мест приложения

Сообщение о разрешении доступа к камере и микрофону сейчас появляется при запуске приложенияСообщения были подключены при помощи возможности...

200
Глобальный метод в WPF

Глобальный метод в WPF

Как мне инициализировать глобальный метод в приложении WPFНаподобие program

145
c# excel определить последнюю ячейку

c# excel определить последнюю ячейку

Есть xls файл, созданный сторонней программойВ нем 28 030 подряд вниз заполненных ячеек в столбце

214