Почему Resharper дает мне это нарушение ограничений, и как я могу умиротворить его?

Я получаю несколько "Возможных" нулевых "назначений для сущности, помеченной атрибутом" NotNull "" из R# в коде, таком как:

if ((webResponse.StatusCode == HttpStatusCode.OK) && (webResponse.ContentLength > 0))
{
    var reader = new StreamReader(webResponse.GetResponseStream()); // <-- R# hates this line of code

Как в этом случае StreamReader может быть нулевым? Если это возможно, как я могу защищаться от этой возможности?

ОБНОВИТЬ

Хорошо, если я изменю этот код:

String strResult;
WebRequest objRequest = WebRequest.Create(strURL);
WebResponse objResponse = objRequest.GetResponse();
using (var sr = new StreamReader(objResponse.GetResponseStream()))
{
    strResult = sr.ReadToEnd();
    sr.Close();
}
return strResult;

...к этому:

String strResult = string.Empty;
WebRequest objRequest = WebRequest.Create(strURL);
WebResponse objResponse = objRequest.GetResponse();
using (var sr = new StreamReader(objResponse.GetResponseStream()))
{
    if (sr != null)
    {
        strResult = sr.ReadToEnd();
        sr.Close();
    }
}
return strResult;

... Я все еще получаю тот же фингервинг на той же ("использующей") линии.

И если я изменю это на это:

String strResult = string.Empty;
WebRequest objRequest = WebRequest.Create(strURL);
WebResponse objResponse = objRequest.GetResponse();
if (objResponse != null)
{
    using (var sr = new StreamReader(objResponse.GetResponseStream()))
    {
        strResult = sr.ReadToEnd();
        sr.Close();
    }
}
return strResult;

... "Возможное" нулевое "назначение объекту, отмеченному атрибутом" NotNull "", все еще относится к той же строке. Так, как я могу нанести ядерный удар R#? ISTM, что "использование" обернул бы необходимую проверку для нуля...

ОБНОВЛЕНИЕ 2

Решарпер жалуется на эту строку:

var reader = new StreamReader(webResponse.GetResponseStream());

... " Возможное" нулевое "назначение объекту, отмеченному атрибутом " NotNull " "

Поэтому я изменил его, чтобы проверить как webResponse, так и читатель:

var webResponse = (HttpWebResponse)webRequest.GetResponse();
if ((webResponse != null) && (webResponse.StatusCode == HttpStatusCode.OK) && (webResponse.ContentLength > 0))
{
    var reader = new StreamReader(webResponse.GetResponseStream());
    if (reader != null)
    {

... но потом я получаю " Выражение всегда верно " для обоих тестов "!="; поэтому кажется, что он говорит: "Берегись! webResponse может быть нулевым!" и / или "Осторожно! читатель может быть нулевым!" но затем говорят: "Это потраченный впустую код - они никогда не будут нулевыми".

2 ответа

Решение
if ((webResponse.StatusCode == HttpStatusCode.OK) && (webResponse.ContentLength > 0))
{
    var responsestream = webResponse.GetResponseStream();
    if(responsestream != null) {
        var reader = new StreamReader(responsestream );
    }
}

Это не StreamReader это ноль, это ReponseStream, Просто добавьте проверку, чтобы убедиться, что возвращенный ResponseStream не является нулевым, если вы хотите, чтобы предупреждение исчезло.

Это не потоковый читатель, который может быть нулевым, это результат webResponse.GetResponseStream()

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