Nie rozumiem dlaczego C# kończy się wykonaniem nieprawidłową metodę rozszerzenia w poniższym kodzie LINQPad:Lambda z "x => {rzut ..}" wywnioskowano, aby dopasować Func <T,Task> w przeciążonej metodzie?
void Main()
{
// Actual: Sync Action
"Expected: Sync Action".Run(x => { x.Dump(); });
// Actual: Async Task
"Expected: Async Task".Run(async x => { await System.Threading.Tasks.Task.Run(() => x.Dump()); });
// Actual: Async Task!!
"Expected: Sync Action".Run(x => { throw new Exception("Meh"); });
}
static class Extensions
{
public static void Run<T>(this T instance, Action<T> action)
{
"Actual: Sync Action".Dump();
action(instance);
}
public static void Run<T>(this T instance, Func<T, System.Threading.Tasks.Task> func)
{
"Actual: Async Task".Dump();
func(instance).Wait();
}
}
Dlaczego kompilator że lambda zwraca zadanie tutaj?
Oczekiwano, że w trzecim wywołaniu funkcji Run() pojawi się komunikat "Actual: Sync Action", ponieważ nic w lambda nie oznacza, że jest to zadanie zwracające Func.
Jest to kod LINQPad .. Nic specjalnego z wyjątkiem Dump() metodę rozszerzenia. – ichen
Masz rację, w rzeczywistości nie ma ona związku z metodą rozszerzenia, ponieważ udało mi się ją odtworzyć przy użyciu normalnie przeładowanych metod. – ichen