¿Qué es una excepción de “índice fuera de rango” y cómo la soluciono?

Obtengo uno de los siguientes errores:

  • “El índice estaba fuera de rango. Debe ser no negativo y menor que el tamaño de la colección”
  • “El índice de inserción estaba fuera de rango. Debe ser no negativo y menor o igual que el tamaño”.
  • “El índice esta fuera de los límites de la matriz.”

¿Qué significa y cómo lo soluciono?

Ver también
IndexOutOfRangeException
ArgumentOutOfRangeException

¿Por qué ocurre este error?

Porque intentó acceder a un elemento en una colección, utilizando un índice numérico que excede los límites de la colección.

El primer elemento de una colección generalmente se encuentra en el índice 0 . El último elemento está en el índice n-1 , donde n es el Size de la colección (el número de elementos que contiene). Si intenta utilizar un número negativo como índice o un número mayor que el Size-1 , obtendrá un error.

Cómo funcionan las matrices de indexación

Cuando declaras una matriz como esta:

 var array = new int[6] 

El primer y el último elemento de la matriz son

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

Entonces cuando escribes:

 var element = array[5]; 

estás recuperando el sexto elemento en la matriz, no el quinto.

Por lo general, debería recorrer una matriz como esta:

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

Esto funciona, porque el ciclo comienza en cero y termina en Length-1 porque el index ya no es menor que la Length .

Esto, sin embargo, lanzará una excepción:

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

Observe el <= allí? index estará ahora fuera de rango en la última iteración del bucle, porque el bucle piensa que Length es un índice válido, pero no lo es.

Cómo funcionan otras colecciones

Las listas funcionan de la misma manera, excepto que generalmente usa Count lugar de Length . Todavía comienzan en cero y terminan en el Count - 1 .

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

Sin embargo, también puede iterar a través de una lista utilizando foreach , evitando por completo el problema de la indexación:

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

No puede indexar un elemento que aún no se haya agregado a una colección.

 var list = new List(); list.Add("Zero"); list.Add("One"); list.Add("Two"); Console.WriteLine(list[3]); // Throws exception.