我使用的是Visual Studio 2017和C#。
当我运行此for循环时,它迭代超过0,我变为4294967295
//where loActionList.Count starts at 1
// First time through loop works
// Second time I can see i decrement to 4294967295
// I'm declaring i as uint because loActionList requires it
// and because other vars require it (they are based on an external API)
for (uint i = loActionList.Count - 1; i >= 0; i--)
{
....
}
我可以这样做:
for (int i = (int)loActionList.Count - 1; i >= 0; i--)
{
IPXC_Action_Goto myvar = (IPXC_Action_Goto)loActionList[(uint)i];
}
...但我想知道是否有另一种方法可以解决这个问题。 也许只是阻止for循环超过0的东西?
已解决:我最终使用@ RonBeyer建议使用此代码if (i == 0) break;
添加中断。
答案 0 :(得分:4)
要了解此问题,让我们看看for
循环与常规int
:
int i;
for(i = 5; i >= 0; i--) {
Console.Write(i);
}
运行它,你会得到543210
,因为你期待。
但是,如果您现在输出i
,则会获得-1
。它停止了,因为在制作i = -1
之后,它检查了-1 >= 0
,然后看到它是false
并已中止。
uint
(无符号整数)的问题是0 - 1
上的uint
给出了它的最大值,因为它包裹回来。完成0 - 1
之后,它会检查并BIG_NUMBER_HERE >= 0
是真的,所以它会继续。
有几种简单的方法可以避免这种情况。您使用的具体取决于您的使用案例/个人品味:
int
代替uint
1
,然后以> 0
结束i >= 0 && i < BIG_NUMBER_HERE
if (i == 0) break;
循环结束时添加for
,如果您已达到零,则强制退出(感谢Ron Beyer)。 BIG_NUMBER_HERE
将是uint
最大值。它在这里和那里如何得到这个数字是不同的,但是如果你需要的话,应该有一个常数可以给你这个数字。
答案 1 :(得分:1)
如果您遇到问号问题,但需要uint
的基数,我建议您坚持使用。
如果API需要特定的数据类型,例如uint
,我会为每次调用投放它,以尽量减少对代码的损害。
for (var i = loActionList.LongCount() - 1; i >= 0; i--)
{
IPXC_Action_Goto myvar = (IPXC_Action_Goto)loActionList[(uint)i];
}