【问题标题】:IndexOutOfRangeException in indexed getter索引 getter 中的 IndexOutOfRangeException
【发布时间】:2012-09-03 01:45:52
【问题描述】:

在我的索引属性中,我检查索引是否超出范围。如果是,我抛出一个IndexOutOfBoundsException

当我运行代码分析器(在 VS12 中)时,它会抱怨 CA1065: Unexpected exception in unexpected location。

仅参考CA1065的描述

System.InvalidOperationException
System.NotSupportedException
System.ArgumentException
KeyNotFoundException

在索引 getter 中是允许的。

投掷IndexOutOfBoundsException 对我来说似乎很自然,那么这里的推理是什么? (是的,我知道我可以关闭警告,我只是想知道原因)

【问题讨论】:

  • 请张贴代码,说明您在哪里抛出异常以及在哪里捕获异常。
  • 这很奇怪。 System.String.this[int] 会抛出 IndexOutOfRange,因此库中的主类不遵循此准则。
  • @Blam:只是出于好奇:这会给你带来什么?
  • 如果你有一些你不知道的错误语法
  • @Blam -- 这里的语法无关 -- 代码分析不检查语法。他所描述的内容清晰而直截了当。无需代码示例。

标签: c# .net code-analyst


【解决方案1】:

很多类为此使用ArgumentOutOfRangeException,包括List<T>。这是ArgumentException 的子类,因此应该满足规则。我猜你可能会争辩说,对于直接访问的向量等,实际上没有方法调用(它是专用的操作码 - ldelem*),所以这种情况下的索引不是实际上一个论点。不过,这似乎是一个软弱的论点。

【讨论】:

  • 我不得不不同意将索引器的参数称为索引是一个弱参数。和 MSDN 一样。 “索引器允许类或结构的实例像数组一样被索引。” via msdn.microsoft.com/en-us/library/vstudio/6x16t2tx.aspx -- 那么为什么索引器不应该像数组一样呢?
【解决方案2】:

参见 MSDN:IndexOutOfRangeException 是系统异常,保留用于访问数组元素。它是由一些 MSIL 指令抛出的:ldelem., ldelema, stelem..

对于开发类,请使用 ArgumentOutOfRangeException。

【讨论】:

  • Marc 打败了你 :-)
  • 也通过 MSDN(根据我对 Marc 的回复):“索引器允许类或结构的实例像数组一样被索引。” -- 再说一次,如果索引器的目的是模拟一个数组,为什么 IndexOutOfRangeException 会被禁止?
  • 该异常旨在用于运行时数组边界检查(可能会因优化而关闭)。但是,如果您愿意,当然可以使用它:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
相关资源
最近更新 更多