Нулевой условный оператор, на некоторых машинах не работает должным образом

У меня есть следующий код в DelegatingHandler для проекта WebApi 2.

    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 Redirect (где result.content будет нулевым), я получаю responseContent == null; однако на машине коллег он получает исключение нулевой ссылки в этой строке. Мы оба используем среду выполнения 4.5.1, насколько мы можем судить о различиях в следующем:

  • Я использую VS2015 Enterprise SP2 (там, где он работает), он использует VS2015 Professional SP2 (там, где он не работает)

Редактирование ниндзя - версии.NET и пакеты обновления, которые я установил, а также те, которые он установил...

Похоже, что на компьютере, на котором он не работает, установлены два обновления безопасности 4.5.1 ( KB2901126 и KB2931368), которые у меня не установлены, может ли одна из них вызвать эту проблему? Есть ли разница в компиляторах или опциях компилятора, которые мне нужно проверить? Или я смотрю на то, что имеет более простое объяснение?

1 ответ

Решение

Я не знаю, в чем разница между двумя машинами, но ваш код неверен:

await result.Content?.ReadAsStringAsync();

Что это делает, это когда result.Content не является null, ReadAsStringAsync() называется и его результат awaitРед, как и должно быть. Но когда result.Content является null, все подвыражение result.Content?.ReadAsStringAsync() является null, что означает, что await бросит NullReferenceException,

Итак, если вы хотите защитить от result.Content являющийся null, вы должны, вероятно, использовать старомодный if или троичный оператор.

Другие вопросы по тегам