This question already has answers here:
What is an IndexOutOfRangeException / ArgumentOutOfRangeException and how do I fix it?

(4个答案)


5年前关闭。




我收到以下错误之一:
  • “索引超出范围。必须为非负数并且小于集合的大小。”
  • “插入索引超出范围。必须为非负数并且小于或等于大小。”
  • “索引超出了数组的范围。”

  • 这是什么意思,我该如何解决?

    另请参见
    IndexOutOfRangeException
    ArgumentOutOfRangeException

    最佳答案

    为什么会发生此错误?
    因为您尝试访问集合中的元素,所以使用了超出集合边界的数字索引。
    集合中的第一个元素通常位于索引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.
    

    关于c# - 什么是 “index out of range”异常,如何解决? [复制],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24812679/

    10-10 18:29
    查看更多