C# 参数超出范围异常

C# 参数超出范围异常,c#,exception,xna,C#,Exception,Xna,有人能告诉我为什么我会得到这个例外吗?我知道我得到它的“原因”,因为它说我试图访问的列表中的元素不存在,但是通过代码我可以看到它确实存在 在Game1中,我调用助手类的计算方法。然后,当计算完成后,我将结果添加到CalculationHelper类的列表中。 此操作的代码如下所示: 在Game1类中,我实例化了CalculationHelper calcHelper类,然后调用其中一个类方法。 首先,在Game1中,我在for()循环中调用calcHelper.forceVanizingPoin

有人能告诉我为什么我会得到这个例外吗?我知道我得到它的“原因”,因为它说我试图访问的列表中的元素不存在,但是通过代码我可以看到它确实存在

在Game1中,我调用助手类的计算方法。然后,当计算完成后,我将结果添加到CalculationHelper类的列表中。 此操作的代码如下所示:

在Game1类中,我实例化了CalculationHelper calcHelper类,然后调用其中一个类方法。 首先,在Game1中,我在for()循环中调用calcHelper.forceVanizingPointCrossips(…)方法,如下所示。这很好,calcHelper.forceVanizingPointIntersections(…)方法将该值添加到CalculationHelper类中的IntersectionPointList中(请参见下面的方法)

说指数超出范围?但是在代码中,我的IntersectionPointList被更新,它显示该列表现在包含2个值。我正在尝试访问第二个值

有人知道为什么会这样吗? 就我的一生而言,我不知道我错在哪里

如果需要更多的代码,我可以发布更多,只需让我知道(int I=0;Ifor (int i = 0; i < LineList.Count; i++) { calcHelper.ForceVanishingPointIntersections(LineList[i], LineList[i + 1]); ... i++; } { calcHelper.ForceVanizingPoint交点(线列表[i],线列表[i+1]); ... i++; } 不要这样做,你应该做:

for (int i = 0; i < LineList.Count; i += 2)
{
    calcHelper.ForceVanishingPointIntersections(LineList[i], LineList[i + 1]);

    ...
}
for(int i=0;i
如果LineList.Count不是偶数,例如:3。 它将从0开始,使用0和1。 然后跳到2,你用2和3。 但是哎呀!没有3个! 只数3!0比2

这时您将得到参数超出范围的异常。 为了避免这种情况,您可以检查计数%2==0,或者如果您不介意跳过额外的,则可以一直到LineList.Count-1。

for(int i=0;i
不要这样做,你应该做:

for (int i = 0; i < LineList.Count; i += 2)
{
    calcHelper.ForceVanishingPointIntersections(LineList[i], LineList[i + 1]);

    ...
}
for(int i=0;i
如果LineList.Count不是偶数,例如:3。 它将从0开始,使用0和1。 然后跳到2,你用2和3。 但是哎呀!没有3个! 只数3!0比2

这时您将得到参数超出范围的异常。
为了避免这种情况,您可以检查计数%2==0,也可以一直到LineList.Count-1,如果您不介意跳过多余的,如果有的话。

看起来您在为每个精灵添加两行。索引不会对齐。当LineList有10个项目时,您将只有5个IntersectionPointList项目,因此传入9的索引将失败

您应该将行列表集合更改为
List
,以便每个项目有两行与每个精灵对齐。这将在线条和精灵之间创建一对一的关系


我想您总是可以传入一个索引(I/2),它应该是每两行的正确精灵。

看起来您要为每个精灵添加两行。索引不会对齐。当LineList有10个项目时,您将只有5个IntersectionPointList项目,因此传入9的索引将失败

您应该将行列表集合更改为
List
,以便每个项目有两行与每个精灵对齐。这将在线条和精灵之间创建一对一的关系


我想您总是可以传入一个索引(I/2),它应该是每两行的正确精灵。

因为您使用索引
I+1
访问
LineList[]
,所以必须在for条件下将最后一个索引减少1。(注意
-1

请注意,
LineList
的索引范围是
0。。。计数-1


如果需要不重叠的索引,例如

(0, 1), (2, 3), (4, 5), ... (Count-2, Count-1)
由于使用索引
i+1
访问
LineList[]
,因此必须在for条件下将最后一个索引减少1。(注意
-1

请注意,
LineList
的索引范围是
0。。。计数-1


如果需要不重叠的索引,例如

(0, 1), (2, 3), (4, 5), ... (Count-2, Count-1)
你看到OP在循环的底部有一个额外的i++吗?这不是实现这一点的最佳方法,但它确实会将最后一个索引减少1。对不起,我没有看到它。它在每个循环中将索引增加2;但是,它不会将最后一个索引减少1!仍然需要将条件更改为
i
。非常正确。。。但也要注意,直到GetIntersectionPointListElementAt,错误才会发生。在我看来,LineList集合的项数是IntersectionPointList集合的两倍,但OP只是从LineList集合传入索引i。在这种情况下,调用必须更改为
GetIntersectionPointListelement(i/2)
。非常感谢这些家伙。工作很愉快。从来不知道可以在for循环中声明这样的2个值(i和k)。将来它会很有用的。你每天都在学习新东西你看到OP在循环的底部有一个额外的i++吗?这不是实现这一点的最佳方法,但它确实会将最后一个索引减少1。对不起,我没有看到它。它在每个循环中将索引增加2;但是,它不会将最后一个索引减少1!仍然需要将条件更改为
i
。非常正确。。。但也要注意,直到GetIntersectionPointListElementAt,错误才会发生。在我看来,LineList集合的项数是IntersectionPointList集合的两倍,但OP只是从LineList传入索引i
for (int i = 0; i < LineList.Count - 1; i++) {
    calcHelper.ForceVanishingPointIntersections(LineList[i], LineList[i + 1]);
    AddSprite( ... );
}
(0, 1), (1, 2), (2, 3), ... (Count-2, Count-1) (0, 1), (2, 3), (4, 5), ... (Count-2, Count-1)
for (int i = 0; i < LineList.Count - 1; i += 2) {
    calcHelper.ForceVanishingPointIntersections(LineList[i], LineList[i + 1]);
    AddSprite(
        VanishingPointIntersectionList,
        calcHelper.GetIntersectionPointListElementAt(i / 2),
        greenCirlce);
}
for (int i = 0, k = 0; i < LineList.Count - 1; i += 2, k++) {
    calcHelper.ForceVanishingPointIntersections(LineList[i], LineList[i + 1]);
    AddSprite(
        VanishingPointIntersectionList,
        calcHelper.GetIntersectionPointListElementAt(k),
        greenCirlce);
}