具有两个索引参数的方法,其中有效范围相互依赖:ArgumentOutOfRangeException 或 ArgumentException?

Method with two index parameters, where valid range interdependent: ArgumentOutOfRangeException OR ArgumentException?

考虑以下场景:

一个方法期望两个索引被确定为参数,并且其中一个等于或大于另一个,使得有效范围相互依赖。

例如,获取数组子副本的方法,具有开始和结束索引:

public static T[] Sub<T>(this T[] @this, int start, int end) {
    //Somewhere within...
    var newLength = end - start;
    if (newLength < 0)
        //Throw exception because end<start...
}

现在,这是(诚然有点无关紧要,但仍然很有趣 [恕我直言])的问题:

ArgumentOutOfRangeException 定义为:

The exception that is thrown when the value of an argument is outside the allowable range of values as defined by the invoked method.

哪个适合这个场景,哪个不适合:

另一方面,ArgumentException 定义为:

The exception that is thrown when one of the arguments provided to a method is not valid.

考虑到我关于 B 的有效范围如何由 A 定义的论点,实际上完全符合:

  • 一个参数 B 在小于 A.
  • 无效

然而,异常(不管是哪个)仍然基于 index,并直接与有效或无效的 ranges 相关联如果索引...

所以...

是否应该抛出更一般的 ArgumentException,因为它是使它们无效的索引组合?

是否应该抛出更具体的 ArgumentOutOfRangeException,即使这里的 "invalidity" 没有(?)相当 匹配异常的预期用途?

还是应该 SomethingElseEntirelyException 被抛出?

我会选择 ArgumentOutOfRangeException。这与框架中其他地方的其他示例相吻合:

另一方面,我也应该举个反例:

我不确定为什么最后一个是这样定义的,但我想说该方法根据其他方法定义有效值范围是合理的参数和对象的状态。不过,我个人会尝试根据 较早的 参数来定义特定参数的有效值范围 - 所以如果您有 Foo(int x, int y) 并且要求 x < y , 那么我会说 y 的有效范围是根据 x.

定义的