Null条件运算符,在某些计算机上的行为不符合预期



我在WebApi 2项目的DelegatingHandler中有以下代码。

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var content = await request.Content?.ReadAsStringAsync();
        _log.Information("Received {request} with content body: {content}.", request, content);
        // Run the rest of the request pipeline.
        var result = await base.SendAsync(request, cancellationToken);
        var responseContent = await result.Content?.ReadAsStringAsync();
        _log.Information("Returning {result} with content body: {responseContent}.", result, responseContent);
        return result;
    }

在我的机器上,这按预期工作,在301重定向的响应期间(其中result.content为null),我得到responseContent==null;然而,在同事机器上,他在这一行收到一个空引用异常。我们都使用4.5.1运行时,据我们所知,差异如下:

  • 我使用的是VS2015 Enterprise SP2(在它工作的地方),他使用的是VS 2015专业SP2(不起作用的地方)

Ninja Edit-我安装的.NET版本和service Pack,以及他安装的。。。

看起来它不工作的机器安装了两个4.5.1安全更新(KB2901126和KB2931368),但我没有,其中一个会导致这个问题吗?我需要检查的编译器或编译器选项是否存在差异?还是我在寻找一个更简单的解释?

我不知道这两台机器之间有什么区别,但你的代码是错误的:

await result.Content?.ReadAsStringAsync();

这样做的作用是,当result.Content不是null时,ReadAsStringAsync()被调用,其结果是awaited,这是应该的。但是当result.Contentnull时,整个子表达式result.Content?.ReadAsStringAsync()null,这意味着await将抛出一个NullReferenceException

因此,如果您想防止result.Content成为null,您可能应该使用老式的if或三元运算符。

相关内容

  • 没有找到相关文章

最新更新