Ошибка IndexOutOfRangeException
System.IndexOutOfRangeException: Index was outside the bounds of the array значит: программа обратилась к элементу массива с номером, которого нет. Индексы массива — от 0 до Length - 1, и всё за этими пределами — ошибка.
int[] a = { 10, 20, 30 };
Console.WriteLine(a[0]);
Console.WriteLine(a[2]);
Console.WriteLine(a[3]);Программа выведет 10 и 30, а на a[3] остановится: у массива из трёх элементов последний индекс — 2. Та же ошибка бывает у строк: s[s.Length]. Ошибки, которые возникают при работе программы, в C# называют исключениями: если исключение не обработать, программа останавливается.
Частые причины
Цикл до <=. Самая частая ошибка — условие i <= a.Length: на последней итерации i равно длине, а такого индекса нет. Правильный цикл — с <:
int[] a = { 10, 20, 30 };
for (int i = 0; i < a.Length; i++)
{
Console.WriteLine($"a[{i}] = {a[i]}");
}
Console.WriteLine($"Последний: {a[^1]}");a[0] = 10
a[1] = 20
a[2] = 30
Последний: 30Если номер не нужен, проще foreach: он выйти за границы не может. Последний элемент — a[a.Length - 1] или короче a[^1].
Пустой массив или список. a[0] у пустого массива — тоже ошибка. Если данные приходят извне (ввод, файл), проверьте размер: if (a.Length > 0).
Аргументы командной строки. args[0] в Main — ошибка, если программу запустили без аргументов: массив args пустой. Проверяйте args.Length. Передать аргументы через dotnet run можно после --: dotnet run -- input.txt.
Индекс от пользователя или из вычислений. Номер, введённый с клавиатуры, люди обычно считают с единицы. Отнимите 1 и проверьте диапазон:
int[] prices = { 100, 250, 75 };
Console.Write("Номер товара (1–3): ");
if (int.TryParse(Console.ReadLine(), out int number) && number >= 1 && number <= prices.Length)
{
Console.WriteLine($"Цена: {prices[number - 1]}");
}
else
{
Console.WriteLine("Нет такого товара");
}У списка — другое исключение
List<T> при неверном индексе бросает не IndexOutOfRangeException, а ArgumentOutOfRangeException с сообщением Index was out of range. Must be non-negative and less than the size of the collection. Причины и лечение те же: индексы от 0 до Count - 1. То же исключение даёт Substring с неверными границами.
Как найти место
В сообщении об ошибке есть строка вида at Program.<Main>$(String[] args) in ...\Program.cs:line 4 — файл и номер строки. Запустите программу с отладкой (F5 в Visual Studio): на ошибке она остановится, и можно посмотреть, чему равны индекс и длина массива. Без отладчика выведите их перед проблемной строкой: Console.WriteLine($"i = {i}, длина = {a.Length}");.