You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

List<int>.Enumerator调用MoveNext()无法推进的问题求助

List.Enumerator调用MoveNext()无法推进的问题求助

嗨,这个问题的核心原因其实不是你猜测的结构体复制,而是你没有保留住枚举器依赖的List实例,导致枚举器很快就失效了!

咱们来一步步拆解问题:

首先看你MyEnumerator构造函数里的这段代码:

_enumerator = Enumerable.Range(1,5).ToList().GetEnumerator();

这里Enumerable.Range(1,5).ToList()会创建一个临时的List<int>实例,你只拿了它的枚举器,却没有用任何变量去引用这个List本身。构造函数执行完之后,这个List就没有任何“持有者”了,垃圾回收器很快就会把它回收掉。

那为什么第一次的Current是正确的?因为构造函数里紧接着调用了_enumerator.MoveNext(),这时候临时List还没被回收,枚举器能正常定位到第一个元素。但等你后续再调用MoveNext()时,对应的List已经被销毁了,枚举器失去了遍历的数据源,自然无法推进,Current也就一直停留在1。

你提到的List<int>.Enumerator是值类型的问题,这次其实没触发——因为_enumerator是类的字段,每次调用MoveNext()和访问Current都是直接操作这个字段里的结构体实例,没有发生额外的副本复制。

那怎么修复呢?很简单,把创建的List也保存为MyEnumerator的字段,让它一直被引用着,避免被GC回收:

private class MyEnumerator
{
    private readonly List<int> _sourceList; // 新增字段保存List实例
    private readonly List<int>.Enumerator _enumerator;

    public MyEnumerator()
    {
        _sourceList = Enumerable.Range(1,5).ToList(); // 先把List存起来
        _enumerator = _sourceList.GetEnumerator();
        _enumerator.MoveNext();
    }

    public int Current => _enumerator.Current;

    public bool MoveNext() => _enumerator.MoveNext();
}

修改之后,枚举器就能正常推进,输出结果就会和你的预期一致了。

额外补充一点:List<T>.Enumerator作为值类型,确实存在需要注意的复制场景——比如把它赋值给其他变量、作为参数传递时,都会产生副本,操作副本不会影响原实例。但你的代码里并没有这种情况,这次的问题根源还是数据源被提前回收了。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 03:04:28