【问题标题】:Awaiting with null coalescing operator thrown exception等待空合并运算符抛出异常
【发布时间】:2019-10-19 00:27:42
【问题描述】:

我遇到了一些奇怪的行为。

运行这段代码时:

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

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

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

【问题讨论】:

  • 哪个例外?可能有重复,但我无一例外地找不到。

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


【解决方案1】:

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

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;

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

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

【讨论】:

    【解决方案2】:

    null 安全扩展怎么样?

    public static class TaskExtensions
    {
        public static async Task<T> NullSafe<T>(this Task<T> task)
        {
            return task != default(Task) ? await task : default(T);
        }
    }
    

    用法:

    Task<int> t = null;
    int val = await (t).NullSafe();
    

    对于具体问题,请尝试:

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

    【讨论】:

    • 很好,但是 OP 希望将 UserToken.UnidentifiedUser 作为后备,而不是 default(T)
    • @TheodorZoulias 感谢您指出这一点,我为特定案例添加了一个示例。
    猜你喜欢
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 2018-07-09
    相关资源
    最近更新 更多