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