索引器中的索引超出范围异常

5
在我的索引属性中,我会检查索引是否越界。如果是,我会抛出一个IndexOutOfBoundsException异常。当我运行代码分析器(在VS12中)时,它会报告CA1065:意外的位置中出现了意外的异常。根据CA1065的描述,只有...
System.InvalidOperationException
System.NotSupportedException
System.ArgumentException
KeyNotFoundException

在索引getter中允许使用throws IndexOutOfBoundsException异常。

我认为抛出IndexOutOfBoundsException异常很自然,那么这里的原因是什么呢? (是的,我知道我可以关闭警告,但我只是想知道原因)


1
请发布您抛出异常的代码和捕获异常的代码。 - paparazzo
2
很奇怪。System.String.this[int] 抛出了 IndexOutOfRange 异常,因此该指南未被库中的主类遵循。 - H H
1
@Blam:只是出于好奇,这会给你什么? - Mario The Spoon
如果您有一些您不知道的语法错误 - paparazzo
@Blam -- 这里语法无关紧要 -- 代码分析不会检查语法。他所描述的很清楚明了。不需要提供代码示例。 - BrainSlugs83
2个回答

8
很多类使用 ArgumentOutOfRangeException,包括 List<T>。这是 ArgumentException 的一个子类,因此应该满足规则。我想你可以认为对于直接访问的向量等,实际上没有方法调用(它是一个专用操作码 - ldelem*),所以在这种情况下索引实际上不是参数。虽然这个观点比较薄弱。

我不同意将索引器的参数称为索引是一个弱的论点。MSDN也是这样认为的。“索引器允许类或结构的实例像数组一样被索引。”通过http://msdn.microsoft.com/en-us/library/vstudio/6x16t2tx.aspx - 那么,为什么索引器不能像数组一样运作呢? - BrainSlugs83

6

请查看MSDN:IndexOutOfRangeException是系统异常,用于访问数组元素时抛出。它由一些MSIL指令引发:ldelem.,ldelema,stelem.。

开发类时,请使用ArgumentOutOfRangeException。


马克已经先你一步了 :-) - Mario The Spoon
同样通过 MSDN(根据我回复 Marc 的回复):“索引器允许类或结构的实例像数组一样被索引。”-- 所以,如果索引器的目的是模拟数组,为什么 IndexOutOfRangeException 会受到限制? - BrainSlugs83
那个异常是用于运行时数组边界检查的(由于优化可能会关闭)。但当然,如果您愿意,也可以使用它 :) - STO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接