Что такое исключение "индекс вне диапазона" и как его исправить?

Я получаю одну из следующих ошибок:

  • "Индекс был вне диапазона. Должен быть неотрицательным и меньшим, чем размер коллекции"
  • "Индекс вставки был вне диапазона. Должен быть неотрицательным и меньше или равным размеру".
  • "Индекс находился вне границ массива."

Что это значит, и как мне это исправить?

Смотрите также
IndexOutOfRangeException
ArgumentOutOfRangeException

1 ответ

Почему возникает эта ошибка?

Потому что вы пытались получить доступ к элементу в коллекции, используя числовой индекс, превышающий границы коллекции.

Первый элемент в коллекции обычно располагается по индексу 0, Последний элемент по индексу n-1, где n это Size коллекции (количество элементов в ней). Если вы пытаетесь использовать отрицательное число в качестве индекса или число, которое больше, чем Size-1, вы получите ошибку.

Как работает индексирование массивов

Когда вы объявляете массив следующим образом:

var array = new int[6]

Первый и последний элементы в массиве

var firstElement = array[0];
var lastElement = array[5];

Поэтому, когда вы пишете:

var element = array[5];

Вы получаете шестой элемент в массиве, а не пятый.

Как правило, вы бы зациклились на массиве так:

for (int index = 0; index < array.Length; index++)
{
    Console.WriteLine(array[index]);
}

Это работает, потому что цикл начинается с нуля и заканчивается в Length-1 так как index больше не меньше Length,

Это, однако, вызовет исключение:

for (int index = 0; index <= array.Length; index++)
{
    Console.WriteLine(array[index]);
}

Обратите внимание на <= там? index будет теперь вне диапазона в последней итерации цикла, потому что цикл думает, что Length является допустимым индексом, но это не так.

Как работают другие коллекции

Списки работают одинаково, за исключением того, что вы обычно используете Count вместо Length, Они по-прежнему начинаются с нуля и заканчиваются на Count - 1,

for (int index = 0; i < list.Count; index++)
{
    Console.WriteLine(list[index]);
} 

Тем не менее, вы также можете перебрать список с помощью foreach, избегая всей проблемы индексации целиком:

foreach (var element in list)
{
    Console.WriteLine(element.ToString());
}

Вы не можете индексировать элемент, который еще не был добавлен в коллекцию.

var list = new List<string>();
list.Add("Zero");
list.Add("One");
list.Add("Two");
Console.WriteLine(list[3]);  // Throws exception.
Другие вопросы по тегам