gpt4 book ai didi

c# - 为什么 Elvis (?.) 运算符不适用于异步等待?

转载 作者:可可西里 更新时间:2023-11-01 13:19:36 24 4
gpt4 key购买 nike

让我们编写这样的代码(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

为什么 Elvis 运算符不能与 async-await 一起使用?我错过了什么吗?

最佳答案

await 的翻译方式是,首先,在等待的对象上调用 GetAwaiter()(在您的例子中,是一个 Task) .然后它会做一些其他复杂的事情,但这些与这里无关:

await MyClass?.Job();

编译为:

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

由于 Task.GetAwaiter() 是一个实例方法,并且您使用 null Task 调用它,您会得到一个 NullReferenceException.


出于好奇,可以await一个null awaitable,只要它的GetAwaiter()是一个扩展方法接受:

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

关于c# - 为什么 Elvis (?.) 运算符不适用于异步等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40436213/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com