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

本文关键字:异常 ConcurrentStack | 更新日期: 2023-09-27 18:09:12

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

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

ArgumentOutOfRangeException误差的Message属性:

startIndex参数必须大于等于零。

参数名称:startIndex

数组是空的,但不是null,我没有预料到任何异常,只是没有添加到堆栈中。这是一个合理的例外吗?

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

从实现的角度来看,看一下PushRange(T[], int, int)重载的定义是合理的:

ArgumentOutOfRangeException: startIndexcount为负。或者startIndex大于或等于项的长度。

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

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

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

对于从零开始的索引,0是第一个索引,指向第一个项。所以它实际上是在抱怨数组中没有任何内容

AddRange的参数是一个空数组,因此您试图将零项压入堆栈。所以这是一个非常合理的例外。

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