Анализатор обнаружил, что в метод передаётся индекс, который больше или равен количеству элементов коллекции. Это может привести к выбрасыванию исключения.
Чтобы лучше разобраться в проблеме, рассмотрим пример:
public static void Foo() { List<string> list = new List<string>(20) { "0", "1", "2" }; list.RemoveAt(list.Count); }
При попытке удалить элемент будет выброшено исключение. Метод 'RemoveAt' выбрасывает исключение, если первый аргумент больше или равен количеству элементов коллекции.
Исправленный вариант:
public static void Foo() { List<string> list = new List<string>(20) { "0", "1", "2" }; list.RemoveAt(list.Count - 1); }
Рассмотрим более сложный пример с ошибкой:
public static void ProcessList() { List<string> list = new List<string>(20) { "0", "1", "2" }; string str = GetStringOrNull(list, list.Count); // <= } public static string GetStringOrNull(List<string> list, int index) { if (index > list.Count) return null; return list.ElementAt(index); }
Коллекция 'list' передаётся в метод 'GetStringOrNull', который содержит ошибку в условии оператора 'if'. При подобных аргументах метод должен вернуть 'null', но из-за ошибки выбрасывает исключение.
Исправленный вариант:
public static void ProcessList() { List<string> list = new List<string>(20) { "0", "1", "2" }; string str = GetStringOrNull(list, list.Count); } public static string GetStringOrNull(List<string> list, int index) { if (index >= list.Count) return null; return list.ElementAt(index); }
Данная диагностика классифицируется как: