C# Error with null-conditional operator and await

You can add ?? Operator so if ?. returns null task use CompletedTask instead.

await (this.MyObject?.MyMethod() ?? Task.CompletedTask)

I would've expected that the call to "MyMethod" would simply not be made if "MyObject" is null.

Thats true. the ?. operator returns null task instead of calling MyMethod. the null reference exception is made because you cant await on null task. The task must be initialized.


A lot of discussion takes place around the awkwardness of null conditional in await. You can see some of it in the C# proposal Champion "Null-conditional await" #35. While the accepted answer works, I believe two extensions methods encapsulate the behavior better:

public static Task ForAwait(this Task task)
{
    return task ?? Task.CompletedTask;
}

public static Task<T> ForAwait<T>(this Task<T> task, T defaultValue = default)
{
    return task ?? Task.FromResult(defaultValue);
}

You would use them as: await (this.MyObject?.MyMethod()).ForAwait(). Note the extra parentheses! You can even specify your own default value, if default(T) is not what you want to return by default. I've seen other people do something similar and also add an extra parameter that would ConfigureAwait inside the method.

I would have loved to get rid of the ugly parentheses, somehow, but the language doesn't allow it (yet?).