繁体   English   中英

Java的NoSuchElementException是否具有C#等效项?

[英]Is there a C# equivalent for Java's NoSuchElementException?

Java的NoSuchElementException是否具有C#等效项?

.NET通常为此使用InvalidOperationException 无论如何,您都不应捕获NoSuchElementException ,因为它通常表示程序错误。 因此,在此用例中,具体的异常类型无关紧要。

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

在Java中, NoSuchElementException用于指示已达到枚举的末尾:

EnumerationnextElement方法抛出,以指示该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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM