在C#中使用ConcurrentStack时出现奇怪的异常

时间:2011-09-20 14:43:09

标签: c# concurrency

我有这个C#代码,它抛出一个ArgumentOutOfRangeException,我想知道为什么?

    ConcurrentStack<int> intsStack = new ConcurrentStack<int>();
    int[] myInts = new int[0];
    intsStack.PushRange(myInts);

Message错误的ArgumentOutOfRangeException属性:

  

startIndex参数必须大于或等于零。

     

参数名称:startIndex

数组是空的但不是null,我根本没想到任何异常,只是没有添加任何内容。这是否是一个合理的例外?

3 个答案:

答案 0 :(得分:3)

从实施的角度来看,如果你看一下PushRange(T[], int, int) overload的定义是合理的:

  

ArgumentOutOfRangeException: startIndex count 为负数。或 startIndex 大于或等于项目的长度。

数组的长度为零。因此, startIndex 没有可能的有效值。

从文档角度来看,这是不合理的,因为PushRange(T[]) overload的文档没有提及ArgumentOutOfRangeException

答案 1 :(得分:2)

AddRange的参数是一个空数组,因此您尝试将零项目推送到堆栈。所以这是一个非常合理的例外。

编辑:但你是对的,这是一个错误的异常消息。您可以猜测它是因为内部重载PushRange(T [],Int32,Int32)实际上是抛出异常。

答案 2 :(得分:2)

如果数组为空,则它没有索引0,这就是它所抱怨的。

使用基于零的索引,0是第一个索引,指向第一个项目。所以实际上它抱怨数组中没有任何东西。