Почему Элвис?.) оператор не работает с 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