IEnumerator.Current和IEnumerator <T> .Current的不同异常抛出行为 - c#

我通过调用IEnumerable<T>.GetEnumerator()获得了一个枚举器,然后将其称为MoveNext()直到返回false,然后访问其Current属性。令我惊讶的是,没有引发任何异常。

挖掘MSDN,我发现非通用版本will throw if Current is accessed after MoveNext() returned false,而通用版本will not。

有人可以解释这种差异吗?

参考方案

通用枚举器的行为是不确定的,一切皆有可能,最终取决于集合类型来定义未定义的含义。

但是它们可以做一些合理的事情,而不仅仅是抛出,泛型枚举器知道集合对象的类型。这样他们就可以返回default(T)

非通用枚举器没有那么奢侈,它们只能返回null或new object()。实际上,ArrayList的代码为此保留了一个静态对象。但是实际上并没有使用它,就像他们在进行可用性测试后改变了主意。返回任何一个都会使客户端代码失败,并带有非常令人讨厌的异常NullReferenceException或InvalidCastException。在这些集合的正常使用中也可能会引发异常,因此几乎没有提示发生事故的真正原因。所以他们没有,而是抛出InvalidOperationException。

Java中的<<或>>>是什么意思? - java

This question already has answers here: Closed 7 years ago. Possible Duplicate: What does >> and >>> mean in Java?我在一些Java代码中遇到了一些陌生的符号,尽管代码可以正确编译和运行,但对于括号在此代码中的作用却感…

菱形运算符<>是否等于<?> - java

我在util.TreeSet类中发现,其中一个构造函数正在使用具有空泛型类型的新TreeMap调用另一个构造函数。 public TreeSet(Comparator<? super E> comparator) { this(new TreeMap<>(comparator)); } new TreeMap<>是什么意思…

将谓词<T>转换为Func <T,bool> - c#

我有一个包含成员Predicate的类,希望在Linq表达式中使用该类:using System.Linq; class MyClass { public bool DoAllHaveSomeProperty() { return m_instrumentList.All(m_filterExpression); } private IEnumerable&…

声纳测试用例失败 - java

我正在尝试为我的项目之一获得声纳报告。我已经运行mvn clean installRunning blah.blah.BlahTest1 Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.016 sec Running blah.blah.BlahTest2 Tests run…

休眠映射<键,设置<值>> - java

我有以下表格:@Entity @Table(name = "events") Event --id --name @Entity @Table(name = "state") State --id --name @Entity @Table(name = "action") Action --id …