【问题标题】:Index is outside bounds of array [duplicate]索引超出数组范围[重复]
【发布时间】:2014-04-11 01:34:45
【问题描述】:

当我运行它时,它说索引超出了数组的范围,但事实并非如此。 如果我改变 public static ConectorRec[] ch = new ConectorRec[74];到 ConectorRec[] ch = new ConectorRec[75];那么它们不会全部引用到一个对象,并且会在我的代码的其他部分引发其他错误。

using System;
using System.Drawing;
using System.Windows;
using System.Windows.Forms;
using System.Collections.Generic;

namespace Dots
{
    public static class Conectors
    {
        public static ConectorRec[] ch = new ConectorRec[74];
        public static void intitialize()
        {
            ch[0] = new ConectorRec(new Rectangle(10, 20, 10, 40));
            ch[1] = new ConectorRec(new Rectangle(20, 10, 40, 10));
            ch[2] = new ConectorRec(new Rectangle(20, 60, 40, 10));
            ch[3] = new ConectorRec(new Rectangle(60, 20, 10, 40));
            int t = 0;
            int tt = 1;
            for (int i = 4; i<73; i++)
            {
                t++;
                if (t == 1)
                {
                    ch[i] = new ConectorRec(new Rectangle(50 * tt + 20, 10, 40, 10));
                }
                if (t == 2)
                {
                    ch[i] = new ConectorRec(new Rectangle(50 * tt + 20, 60, 40, 10));
                }
                if (t == 3)
                {
                    tt++;
                    ch[i] = new ConectorRec(new Rectangle(50 * tt + 10, 20, 10, 40));
                    t = 0;
                }
            }
            ch[74] = new ConectorRec(new Rectangle(10, 70, 10, 40));
        }
    }
}

请告诉我我做错了什么以及如何解决这个错误。

【问题讨论】:

  • please tell me what I am doing wrong - 你好像在用winforms。
  • 我让它工作了我必须测试我的循环在哪里结束,然后必须像每个人所说的那样使索引更大

标签: c#


【解决方案1】:

数组索引从零开始。你的数组大小是74,所以你的最后一个元素是ch[73]而不是74。您可以使用GetUpperBound 方法进行验证:

var maxIndex = ch.GetUpperBound(0); // this will return 73

来自 C# 规范Section 12. Arrays:

维度的长度决定了该维度的有效索引范围:对于长度为 N 的维度,索引的范围可以从 0 到 N – 1(含)。

在这种情况下,您的数组长度 (N) 为 74,因此最大。索引是73 (N -1)。

【讨论】:

    【解决方案2】:

    错误是由于

    ch[74] = new ConectorRec(new Rectangle(10, 70, 10, 40));
    

    您的数组大小为74,这意味着您的最大索引为73,因为数组索引从0开始

    【讨论】:

      【解决方案3】:

      当我运行它时,它说索引超出了数组的范围,但它不是

      是的。即使我无法查明问题所在,我也总是打赌运行时会比开发人员对此的意见更准确......

      这就是问题所在,循环之后:

      ch[74] = new ConnectorRec(...);
      

      您已在此处声明数组包含 74 个元素:

      public static ConectorRec[] ch = new ConectorRec[74];
      

      所以有效索引是 0..73 (含)。如果要使 74 成为有效索引,则需要将其声明为具有 75 元素:

      public static ConectorRec[] ch = new ConectorRec[75];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-11
        • 2012-01-31
        • 1970-01-01
        • 2015-02-11
        • 1970-01-01
        • 2020-02-13
        • 1970-01-01
        相关资源
        最近更新 更多