等待空传播 System.NullReferenceException
await with null propagation System.NullReferenceException
我有以下代码:
await _user?.DisposeAsync();
Visual Studio
突出显示此代码,说 'Possible NullReferenceException'
顺便说一下,没有 await
Visual Studio
不会显示此警告
为什么NullReferenceException
在这里是可能的?
await 正在等待结果。如果 _user 为 null,则结果将为 null,因此会出现 NullReferenceException。
异步方法 return 一个可以等待的 Task
。如果 _user
为 null 那么您将不会 returning a Task
而是 null
await null
会抛出一个 NullReferenceException
。因此,如果 _user
为 null,则 _user?.DisposeAsync()
将 return null
,并且 await
将抛出。
你可以这样做:
if (_user != null)
{
await _user.DisposeAsync();
}
(您可能需要 _user
的本地副本,如果它可能在读取之间发生变化)
或:
await (_user?.DisposeAsync() ?? ValueTask.CompletedTask);
(在 .NET 5 之前,您需要:)
await (_user?.DisposeAsync().AsTask() ?? Task.CompletedTask);
我有以下代码:
await _user?.DisposeAsync();
Visual Studio
突出显示此代码,说 'Possible NullReferenceException'
顺便说一下,没有 await
Visual Studio
不会显示此警告
为什么NullReferenceException
在这里是可能的?
await 正在等待结果。如果 _user 为 null,则结果将为 null,因此会出现 NullReferenceException。
异步方法 return 一个可以等待的 Task
。如果 _user
为 null 那么您将不会 returning a Task
而是 null
await null
会抛出一个 NullReferenceException
。因此,如果 _user
为 null,则 _user?.DisposeAsync()
将 return null
,并且 await
将抛出。
你可以这样做:
if (_user != null)
{
await _user.DisposeAsync();
}
(您可能需要 _user
的本地副本,如果它可能在读取之间发生变化)
或:
await (_user?.DisposeAsync() ?? ValueTask.CompletedTask);
(在 .NET 5 之前,您需要:)
await (_user?.DisposeAsync().AsTask() ?? Task.CompletedTask);