Take into account this code
Task.Factory.StartNew(
() =>
{
throw new Exception();
}).
ContinueWith(
t =>
{
},
TaskScheduler.FromCurrentSynchronizationContext);
Which results in following error:
error CS1593: Delegate 'System.Action<System.Threading.Tasks.Task,object>' does not take 1 arguments
If I use an overload that takes TaskContinuationOptions.OnlyOnFaulted instead of TaskScheduler.FromCurrentSynchronizationContext it just works. There are two overloads (among twenty of them) of ContinueWith:
public Task ContinueWith(Action<Task> continuationAction, TaskContinuationOptions continuationOptions); public Task ContinueWith(Action<Task> continuationAction, TaskScheduler scheduler);
So, why does the later work and the former doesn’t? Can you guess without reading on?
The explanation is really simple - TaskScheduler.FromCurrentSynchronizationContext is not a property but a method and thus it should be used like TaskScheduler.FromCurrentSynchronizationContext(). Once brackets are in place it works. Rookie mistake.
However the C# compiler’s error message is misleading in this case. Instead of reporting that FromCurrentSynchronizationContext is a method and not a property it yields “can’t find proper overloaded method”. At least it could yield both errors.