等待null合并运算符引发异常

use*_*203 0 c# null-coalescing-operator async-await

我遇到一些奇怪的行为。

运行这段代码时:

var foo = await actionContext.RequestContext?.Principal?.ToUserTokenAsync() ?? UserToken.UnidentifiedUser;
Run Code Online (Sandbox Code Playgroud)

Principalnull在运行时,我得到一个空引用异常。

为什么它不只是返回-> UserToken.UnidentifiedUser

Jon*_*eet 8

我相信这是一个优先问题。您的代码有效:

var foo = (await actionContext.RequestContext?.Principal?.ToUserTokenAsync()) ??
          UserToken.UnidentifiedUser;
Run Code Online (Sandbox Code Playgroud)

换句话说,如果等待的结果为null,则返回UserToken.UnidentifiedUser。但是您仍然尝试等待-这意味着您可能会等待无效的东西,否则会失败。

我怀疑您想要的是:

var task = actionContext.RequestContext?.Principal?.ToUserTokenAsync()
    ?? Task.FromResult(UserToken.UnidentifiedUser);
var foo = await task;
Run Code Online (Sandbox Code Playgroud)

或者在出现null时避免完全等待:

var task = actionContext.RequestContext?.Principal?.ToUserTokenAsync();
var foo = task != null ? await task : UserToken.UnidentifiedUser;
Run Code Online (Sandbox Code Playgroud)