Ich verstehe nicht, warum in dem folgenden LINQPad Code eine falsche Erweiterung Methode C# endet Ausführung:Lambda von "x => {throw ..}" abgeleitet, um Func <T,Task> in überladener Methode übereinzustimmen?
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();
}
}
Warum der Compiler denkt, dass das Lambda hier eine Aufgabe zurückkehrt?
Ich erwartete "Actual: Sync Action" im dritten Aufruf von Run(), da nichts im Lambda angibt, dass dies eine Func-Aufgabe ist.
Dieses IST LINQPad Code .. Nichts Besonderes, außer für den Dump() Erweiterungsmethode zurück. – ichen
Sie haben recht, es hat eigentlich nichts mit der Erweiterungsmethode zu tun, da ich mit normal überladenen Methoden reproduzieren konnte. – ichen