Почему вызов неоднозначен между Task.Run(Func) и Task.Run(Func) при передаче имени методаC#

Место общения программистов C#
Anonymous
Почему вызов неоднозначен между Task.Run(Func) и Task.Run(Func) при передаче имени метода

Сообщение Anonymous »

Я пытаюсь запустить несколько неасинхронных методов одновременно, как показано ниже. Все функции определены в том же классе, что и функции-члены.

Код: Выделить всё

private string getEstimatedWaypointStart()
{
return "id-1";
}

private string getEstimatedWaypointEnd()
{
return "id-2";
}

private void postVector()
{
//These don't compile
Task t1 = Task.Run(getEstimatedWaypointStart);
Task t2 = Task.Run(getEstimatedWaypointEnd);
//These works fine
Task t3 = Task.Run((Func)getEstimatedWaypointStart);
Task t4 = Task.Run(() => getEstimatedWaypointEnd());

/*do stuff*/
}
Однако при попытке построить код я получаю неожиданную ошибку с сообщением о неоднозначности:

Код: Выделить всё

CS0121
The call is ambiguous between the following methods or properties: 'Task.Run(Func)' and 'Task.Run(Func)'
Я нашел в этом посте очень похожую ситуацию. Однако в этом посте делегат не был двусмысленным после удаления ненужного вызова, поскольку его тип определен в параметре метода. Я считаю, что это та же самая причина, по которой актерский состав () решает мою проблему. Но не в моем случае, поскольку функции просто определены в одном классе.
Я не ищу обходного пути, поскольку лямбда-выражение работает нормально. Мне любопытно, есть ли объяснение такого поведения: почему компилятор видит делегата как Func, когда ключевое слово async вообще не используется? Это ошибка в моей текущей довольно старой версии C# (C# 7.3) или это ожидаемо? Если позже, стоит ли мне просто придерживаться лямбда-выражения?

Подробнее здесь: https://stackoverflow.com/questions/786 ... -task-runf

Вернуться в «C#»