我通过调用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。
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 …