[英]Is there a C# equivalent for Java's NoSuchElementException?
.NET通常为此使用InvalidOperationException
。 无论如何,您都不应捕获NoSuchElementException
,因为它通常表示程序错误。 因此,在此用例中,具体的异常类型无关紧要。
不幸的是, InvalidOperationException
在许多地方用于许多不同的事情。 您常常不能从中看出很多。 这是BCL异常层次结构中的一个缺陷。
在Java中, NoSuchElementException
用于指示已达到枚举的末尾:
由
Enumeration
的nextElement
方法抛出,以指示该Enumeration
中没有更多元素。
.NET Framework使用另一个接口,当到达枚举结束时, IEnumerator.MoveNext
将返回false
,而不是引发异常:
如果
MoveNext
通过集合的末尾,则枚举数将位于集合中最后一个元素之后,并且MoveNext
返回false
。 当枚举数位于此位置时,对MoveNext
后续调用也将返回false
。
编辑 :Rawling正确指出,如果超出集合末尾访问Current
属性,仍然可能会出现问题。 在这种情况下,行为不一致。 IEnumerator.Current
声明将抛出异常; 但是, List<T>.Enumerator.Current
指出该行为是未定义的:
为了获得更好的性能,如果枚举数位于第一个元素之前或最后一个元素之后,则此属性不会引发异常。 该属性的值是不确定的。
编辑2 :似乎没有等效的例外。 在.NET中, 您一定不能忽略枚举器的状态 (例如,通过MoveNext
方法的返回值来标识),否则您将遇到未定义的行为,这可能会意外中断应用程序。
Linq使用:
[InvalidOperationException]
随着消息:
Sequence contains no elements
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.