2

JavaNoSuchElementException是否有 C# 等价物?

4

3 回答 3

5

.NET 通常InvalidOperationException用于此目的。无论如何,您不应该捕获NoSuchElementException,因为它通常表示程序错误。因此,在这个用例中,具体的异常类型并不重要。

不幸的是,InvalidOperationException在许多地方用于许多不同的事情。你常常不能从中看出什么。这是 BCL 异常层次结构中的一个缺陷。

于 2013-09-25T13:17:42.407 回答
4

在 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方法的返回值标识),否则您将遇到未定义的行为,这可能会意外地破坏您的应用程序。

于 2013-09-25T13:18:30.597 回答
0

Linq 使用:

[InvalidOperationException]

随着消息:

Sequence contains no elements 
于 2013-09-25T13:18:28.553 回答