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

时间:2019-06-03 12:37:07

标签: c# async-await null-coalescing-operator

我遇到一些奇怪的行为。

运行这段代码时:

var foo = await actionContext.RequestContext?.Principal?.ToUserTokenAsync() ?? UserToken.UnidentifiedUser;

Principal在运行时为null,我得到了空引用异常。

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

1 个答案:

答案 0 :(得分:8)

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

var foo = (await actionContext.RequestContext?.Principal?.ToUserTokenAsync()) ??
          UserToken.UnidentifiedUser;

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

我怀疑你想要的是

var task = actionContext.RequestContext?.Principal?.ToUserTokenAsync()
    ?? Task.FromResult(UserToken.UnidentifiedUser);
var foo = await task;

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

var task = actionContext.RequestContext?.Principal?.ToUserTokenAsync();
var foo = task != null ? await task : UserToken.UnidentifiedUser;