【问题标题】:Strange exception when using ConcurrentStack in C#在 C# 中使用 ConcurrentStack 时出现奇怪的异常
【发布时间】:2011-09-20 14:43:08
【问题描述】:

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

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

ArgumentOutOfRangeException 错误的Message 属性:

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

参数名称:startIndex

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

【问题讨论】:

  • 如果您在致电PushRange 之前MyInts[0] = 0; 会发生什么?
  • 这是否适用于 Stack 的不同实现?
  • @Yahia:这会给他一个IndexOutOfRangeException,因为数组的容量为零。

标签: c# concurrency


【解决方案1】:

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

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

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

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

【讨论】:

  • 这不合理,句号。
【解决方案2】:

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

对于从零开始的索引,0 是第一个索引,指向第一项。所以其实是在抱怨数组里面什么都没有。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 是的,但为什么推送一个空数组会“如此糟糕”?通过 AddRange() 将空数组添加到列表时不会出现异常。
    • @TTT 显然只是一个在实践中没有实际使用 PushRange 的人做出的一些武断决定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多