Почему Элвис?.) оператор не работает с async-await?

давайте иметь такой код (фрагмент App.код XAML.xs):

public class MethodClass
{
    public async Task Job()
    {
        Debug.WriteLine("Doing some sob");
        await Task.Delay(1);
    }
}

public MethodClass MyClass = null;

protected async override void OnLaunched(LaunchActivatedEventArgs e)
{
    await MyClass?.Job(); // here goes NullreferenceException
    MyClass?.Job(); // works fine - does nothing

почему оператор Элвиса не работает с async-await? Я что-то упускаю?

1 ответов


путь await переводится это первое,GetAwaiter() вызывается на ожидаемый объект (в вашем случае a Task). Затем он делает некоторые другие сложные вещи, но они здесь не актуальны:

await MyClass?.Job();

компилируется в:

var awaiter = MyClass?.Job().GetAwaiter();
// more code

С Task.GetAwaiter() является методом экземпляра, и вы вызываете его с помощью null Task вы получаете NullReferenceException.


как любопытство, можно await a null ожидать, пока его GetAwaiter() является методом расширения, который принимает null:

public class NullAwaitable { }

public static class Extensions
{
    public static TaskAwaiter GetAwaiter(this NullAwaitable _)
        => Task.CompletedTask.GetAwaiter();
}

public class MethodClass
{
    public NullAwaitable Job() => new NullAwaitable();
}

MethodClass MyClass = null;

await MyClass?.Job(); // works fine