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