Pull to refresh

Comments 14

ind ?? -1;

Я правильно понимаю, что там должен быть обычный тернарник?

Должно быть .FirstOrDefault(-1)

ind == 0 ? 0 : -1;
Вы имелли в виду вот так? Индексы обычно начинаются с 0, так что подобное исправление будет ошибочным :).

Скорее `ind != 0 ? ind : -1`

Я с C# не работал и думал что результатом LINQ будет значение первого элемента, а не индекс и что 0 не очень хочется в качестве значения иметь.

FirstOrDefault возвращает не индекс, а первый элемент коллекции, но по контексту я думаю, что в коллекции индексы. Так что первый элемент может быть 0.

Думаю, что самым лёгким вариантом будет использование дефолтного значения, если нет подходящего элемента:
FirstOrDefault(-1)

Я понимаю, что суть ваших (очень интересных, спасибо вам) постов не в том, чтобы улучшить качество проверяемых продуктов, но всё же спрошу: раз уж вы для написания статей всё равно проверяете продукты, то их разработчикам о результатах сообщаете?

Конечно, мы всегда сообщаем разработчикам о найденных ошибках и странностях в коде. В основном это issue на GitHub. По PowerToys issue уже создаю, позже добавлю его в коммент.

О половине из этих ошибок в С# предупредит сама VS 2022 если в настройках проекта будет установлено использование Nullable. Иногда приходится редактировать свои старые проекты без Nullable - очень неудобно когда не знаешь надо ли делать проверку на null или там гарантированно есть значение.

Nullable безусловно полезная штука, хотя и холиварная. Кому-то нравится, а кому-то нет. Мне, например среди C# ошибок из этой статьи больше всего нравится про бесполезный '??'. Про этот кейс могу точно сказать, что его VS 2022 не ловит. Да и статические анализаторы же не только разыменования нулевых ссылок ищут.

Да, кейс с ?? очень хорош. Эта статья напомнила что пора бы опять задействовать ваш продукт, и как раз этот кейс обнаружился в одном из проектов.

К слову, если есть такой код:

int? val;
...
if (val != null)
  model.Use(val ?? 0); 
...
class Model {
  public void Use(int val) { ... }
}

то PVS-Studio выдаст предупреждение в последней строчке, но будет доволен таким кодом:

int? val;
...
if (val != null)
  model.Use(val); 

Но тогда VS ругается. Компромис - явное приведение типа:

int? val;
...
if (val != null)
  model.Use((int)val); 

model.Use(val.Value)

Более свежая и прозрачная альтернатива:

int? val;
// ...
if (val is {} actual)
    model.Use(actual);

Спасибо за пример. Я думаю, что анализатор мог бы для подобных случаев понижать уровень предупреждения, или мы и вовсе могли бы добавить это в исключения. Рассмотрим доработку :).
Если что по всем вопросам можно написать нам в поддержку.

    HANDLE proc = OpenProcess(PROCESS_TERMINATE, false, g_settings_process_id);
    if (proc != INVALID_HANDLE_VALUE)

А вот что ваш анализатор не смог увидеть, это то, что OpenProcess возвращает NULL в случае неудачи, а не INVALID_HANDLE_VALUE.

Sign up to leave a comment.