具有 null 传播的 await System.NullReferenceException

await with null propagation System.NullReferenceException

提问人:Maxim Kitsenko 提问时间:5/30/2019 更新时间:3/30/2022 访问量:3021

问:

我有以下代码:

await _user?.DisposeAsync();

Visual Studio突出显示此代码,指出“可能的 NullReferenceException”

顺便说一句,没有不显示此警告 为什么这里可能?awaitVisual StudioNullReferenceException

C# 异常 async-await nullreferenceexception null-propagation-operator

评论


答:

2赞 Steve Todd 5/30/2019 #1

await 期待结果。如果 _user 为 null,则结果将为 null,因此为 NullReferenceException。

4赞 Dan D 5/30/2019 #2

异步方法返回可以等待的 a。如果为 null,则不会返回 nullTask_userTask

18赞 canton7 5/30/2019 #3

await null将抛出一个.因此,如果为 null,则将返回 ,并将抛出。NullReferenceException_user_user?.DisposeAsync()nullawait

您可以执行以下操作:

if (_user != null)
{
    await _user.DisposeAsync();
}

(如果它可能在读取之间更改,则可能需要本地副本)_user

艺术

await (_user?.DisposeAsync() ?? ValueTask.CompletedTask);

(在 .NET 5 之前,你将需要:)

await (_user?.DisposeAsync().AsTask() ?? Task.CompletedTask);

评论

0赞 jornhd 3/30/2022
没有弄清楚.AsTask() 扩展名,但这有效:await (_user?.DisposeAsync() ?? Task.CompletedTask);
0赞 canton7 3/30/2022
@jornhd DisposeAsync 返回 ValueTask。您不能在 a 和 a 之间申请,请参阅此处。看起来您的方法返回 a 而不是 ?所以它不是来自??ValueTask?TaskDisposeAsync()TaskValueTaskIAsyncDisposable