Because
Task.Runhas signatures of bothTask.Run(Func<Task>)andTask.Run(Action), what type is the async anonymous function compiled to? Anasync voidor aFunc<Task>? My gut feeling says it will compile down to anasync voidpurely because its a non-generic type however the C# Compiler might be smart and giveFunc<Task>types preference.
The general rule, even without async, is that a delegate with a return type is a better match than a delegate without a return type. Another example of this is:
static void Foo(Action a) { }
static void Foo(Func<int> f) { }
static void Bar()
{
Foo(() => { throw new Exception(); });
}
This is unambiguous and calls the second overload of Foo.
Also, is there a way to explicitly declare which overload I wish to use?
A nice way to make this clear is to specify the parameter name. The parameter names for the Action and Func<Task> overloads are different.
Task.Run(action: async () => {
await Task.Delay(1000);
});
Task.Run(function: async () => {
await Task.Delay(1000);
});