Анализатор обнаружил оператор 'switch', в котором выбор варианта осуществляется по переменной enum-типа. При этом в операторе 'switch' используются не все элементы перечисления, что может свидетельствовать о наличии ошибки.
Пример кода, в котором встретилась эта ошибка:
public enum Actions { Add, Remove, Replace, Move, Reset };
public void SomeMethod(Actions act)
{
switch (act)
{
case Actions.Add: Calculate(1); break;
case Actions.Remove: Calculate(2); break;
case Actions.Replace: Calculate(3); break;
case Actions.Move: Calculate(5); break;
}
}
В данном случае перечисление 'Actions' содержит 5 именованных констант, а оператор 'switch', выбор в котором осуществляется по данному перечислению, реализует выбор только по 4 из них. Это место является потенциально ошибочным.
Возможно, в ходе рефакторинга в перечисление добавили новую константу, но забыли реализовать выбор по ней в операторе 'switch', или же, что может быть в случае с большими перечислениями, константу банально могли пропустить. В итоге пропущенное значение обрабатывается неправильно.
Тогда корректный код мог бы выглядеть следующим образом:
public void SomeMethod(Actions act)
{
switch (act)
{
case Actions.Add: Calculate(1); break;
case Actions.Remove: Calculate(2); break;
case Actions.Replace: Calculate(3); break;
case Actions.Move: Calculate(5); break;
case Actions.Reset: Calculate(6); break;
}
}
Или так:
public void SomeMethod(Actions act)
{
switch (act)
{
case Actions.Add: Calculate(1); break;
case Actions.Remove: Calculate(2); break;
case Actions.Replace: Calculate(3); break;
case Actions.Move: Calculate(5); break;
default: Calculate(10); break;
}
}
Анализатор выдает предупреждение далеко не всегда, когда в 'switch' используется не все константы из перечисления. Иначе, было бы слишком много ложных срабатываний. Действует целый ряд исключений эмпирического типа. Основные:
Взгляните на примеры ошибок, обнаруженных с помощью диагностики V3002. |