gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:09:54 25 4
gpt4 key购买 nike

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

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

有人可以解释这种区别吗?

最佳答案

泛型枚举器的行为是未定义的,一切皆有可能,最终由集合类型来定义未定义的含义。

但是除了抛出之外,它们还可以做一些合理的事情,通用枚举器知道集合对象的类型。所以他们可以返回 default(T) .

非泛型枚举器没有那么奢侈,它们只能返回 null 或 new object() .实际上,ArrayList 的代码为此目的保留了一个静态对象。但实际上并没有使用它,看起来他们在可用性测试后改变了主意。返回任何一个都会导致客户端代码失败,并出现非常令人不快的异常,NullReferenceException 或 InvalidCastException。在这些集合的正常使用中也可能引发异常,因此对于事故的实际原因几乎没有任何暗示。所以他们没有,而是抛出 InvalidOperationException。

关于c# - IEnumerator.Current 和 IEnumerator<T>.Current 的不同异常抛出行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19489411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com