提问人:Maxim Kitsenko 提问时间:5/30/2019 更新时间:3/30/2022 访问量:3021
具有 null 传播的 await System.NullReferenceException
await with null propagation System.NullReferenceException
问:
我有以下代码:
await _user?.DisposeAsync();
Visual Studio
突出显示此代码,指出“可能的 NullReferenceException”
顺便说一句,没有不显示此警告
为什么这里可能?await
Visual Studio
NullReferenceException
答:
2赞
Steve Todd
5/30/2019
#1
await 期待结果。如果 _user 为 null,则结果将为 null,因此为 NullReferenceException。
4赞
Dan D
5/30/2019
#2
异步方法返回可以等待的 a。如果为 null,则不会返回 nullTask
_user
Task
18赞
canton7
5/30/2019
#3
await null
将抛出一个.因此,如果为 null,则将返回 ,并将抛出。NullReferenceException
_user
_user?.DisposeAsync()
null
await
您可以执行以下操作:
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?
Task
DisposeAsync()
Task
ValueTask
IAsyncDisposable
评论