Java's NoSuchElementException
是否有C#等价物?
答案 0 :(得分:5)
.NET通常使用InvalidOperationException
。你不应该抓住NoSuchElementException
,因为它通常表示程序错误。因此,在这个用例中,具体的异常类型并不重要。
不幸的是,InvalidOperationException
在许多地方用于许多不同的事情。你经常不能说出来。这是BCL异常层次结构中的一个缺陷。
答案 1 :(得分:3)
在Java中,NoSuchElementException
用于表示已达到枚举的结束:
按
nextElement
的{{1}}方法抛出,表示枚举中没有更多元素。
.NET Framework使用不同的接口,IEnumerator.MoveNext
将返回Enumeration
,而不是在枚举结束时抛出异常:
如果
false
通过集合的末尾,则枚举数位于集合中的最后一个元素之后,MoveNext
返回MoveNext
。当枚举数位于此位置时,对false
的后续调用也会返回MoveNext
。
编辑:Rawling正确指出,如果在集合结束后访问false
属性,则可能仍会出现问题。在这种情况下,行为不一致。 IEnumerator.Current
表示将抛出异常;但是,List<T>.Enumerator.Current
表明行为未定义:
为了获得更好的性能,如果枚举数位于第一个元素之前或最后一个元素之后,则此属性不会引发异常。该属性的值未定义。
修改 2 :似乎没有等效的例外。在.NET中,您不能忽略枚举器的状态(例如,通过Current
方法的返回值标识),否则您将遇到未定义的行为,不可预测地打破了你的申请。
答案 2 :(得分:0)
Linq使用:
[InvalidOperationException]
显示消息:
Sequence contains no elements