Решарпер ошибка? Неверно "выражение всегда верно" - PullRequest
4 голосов
/ 06 апреля 2011

Я считаю, что нашел ошибку в resharper. Предположим, у меня есть следующий код:

int[] someArray = new int[10];
while (someArray  != null)
{
     //perhaps some other usage of someArray here, but not assigning it.
     SomeMethod(ref someArray );
}

Если локальная переменная someArray не назначена для нуля в своей области видимости, тогда оператор someArray != null всегда будет истинным. Но это не тот случай, когда эта переменная передается в качестве ref-параметра другому методу, поскольку в этом методе она может быть присвоена нулю. Тогда resharper неправильно предполагает, что someArray != null по-прежнему всегда верно.

Я думал, что поделюсь этой информацией, потому что не уверен, что мне с этим делать. Во-первых, я хотел бы, чтобы кто-нибудь проверил эту ошибку, а затем отправил ее в JetBrains?

Ответы [ 2 ]

9 голосов
/ 06 апреля 2011

Хм, по-видимому, статический анализ Resharper умнее меня ... Код, в котором я правильно получаю "выражение всегда верно" - предупреждение:

int[] someArray = new int[10];
while (someArray != null)
{
    Foo(ref someArray);
    someArray.Bar();
}

Я получаю предупреждениечто someArray != null является избыточным, поэтому я подумал, что Resharper неверно истолковал параметр ref, так как someArray фактически может быть назначен на ноль.Но это не причина, почему предупреждение верно.Тогда играет роль тонкий факт: то, что someArray равно нулю, будет означать, что при вызове Bar будет выброшено NullReferenceException, и при этом изменяется поток управления так, что начало цикла while не достигается.,Таким образом, даже если someArray присвоено значение NULL в Foo, предупреждение верно.

Моя ошибка, и спасибо всем за ваши усилия.

1 голос
/ 06 апреля 2011

Попробуйте изменить этот цикл на do-while и проверьте, какой reharper помечает его в этой ситуации.Это все еще всегда правда?Но в первом цикле это действительно «всегда верно», поэтому resharper оценивает его правильно (это статический анализ).

...