Je reçois une des erreurs suivantes:
- "L'indice était en dehors des limites. Doit être non négatif et inférieur à la taille de la collection"
- "L'indice d'insertion était hors limites. Doit être non négatif et de taille inférieure ou égale à la taille."
- "L'index était en dehors des limites du tableau."
Qu'est-ce que cela signifie et comment puis-je résoudre le problème?
Voir également
IndexOutOfRangeException
ArgumentOutOfRangeException
Réponses:
33 pour la réponse № 1Pourquoi cette erreur se produit?
Parce que vous avez essayé d’accéder à un élément d’une collection, utilisez un index numérique qui dépasse les limites de la collection.
Le premier élément d'une collection est généralement situé à l'index 0
. Le dernier élément est à l'index n-1
, où n
est le Size
de la collection (le nombre d'éléments qu'elle contient). Si vous essayez d’utiliser un nombre négatif comme index ou un nombre supérieur à Size-1
, vous allez avoir une erreur.
Comment fonctionne l'indexation des tableaux
Lorsque vous déclarez un tableau comme ceci:
var array = new int[6]
Les premier et dernier éléments du tableau sont
var firstElement = array[0];
var lastElement = array[5];
Alors quand tu écris:
var element = array[5];
vous récupérez le sixième élément du tableau, pas le cinquième.
En règle générale, vous passez en boucle sur un tableau comme ceci:
for (int index = 0; index < array.Length; index++)
{
Console.WriteLine(array[index]);
}
Cela fonctionne car la boucle commence à zéro et se termine à Length-1
car index
n'est plus inférieur à Length
.
Ceci, cependant, jettera une exception:
for (int index = 0; index <= array.Length; index++)
{
Console.WriteLine(array[index]);
}
Remarquez le <=
Là? index
sera maintenant hors de portée dans la dernière itération de la boucle, car la boucle pense que Length
est un index valide, mais ce n'est pas le cas.
Comment fonctionnent les autres collections
Les listes fonctionnent de la même manière, sauf que vous utilisez généralement Count
au lieu de Length
. Ils commencent toujours à zéro et se terminent à Count - 1
.
for (int index = 0; i < list.Count; index++)
{
Console.WriteLine(list[index]);
}
Cependant, vous pouvez aussi parcourir une liste en utilisant foreach
en évitant tout le problème de l'indexation:
foreach (var element in list)
{
Console.WriteLine(element.ToString());
}
Vous ne pouvez pas indexer un élément qui n’a pas encore été ajouté à une collection.
var list = new List<string>();
list.Add("Zero");
list.Add("One");
list.Add("Two");
Console.WriteLine(list[3]); // Throws exception.