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

C#中IEnumerable<T>异常行为:赋值后Value为何仍为null?

问题原因:LINQ延迟执行特性导致的对象重复创建

你的代码核心问题出在LINQ的延迟执行机制上,具体逻辑如下:

  1. GetAList()返回的IEnumerable<A>是一个延迟执行的LINQ查询结果。Select操作不会在调用时就创建所有A对象,而是在每次枚举(遍历)这个IEnumerable时,才会执行new A { Name = _.ToString() }的逻辑,生成新的A实例。

  2. 第一次foreach遍历aList时,触发了查询执行:遍历数组{1,2,3},创建3个A对象,给它们的Name赋值,并设置Value = 1.0。但这些对象没有被持久化存储,遍历结束后就失去了引用。

  3. 当调用aList.ToList()时,会再次触发LINQ查询的执行:重新遍历数组,创建3个全新的A对象,这些新对象仅初始化了Name,Value保持默认的null,最终被存入aResult列表。

解决办法

要避免这种问题,只需要让LINQ查询立即执行并保存结果,终止延迟执行状态:

  • 方案一:在GetAList中直接返回已实例化的列表
public static List<A> GetAList()
{
    var arr = new int[] { 1, 2, 3 };
    return arr.Select(_ => new A { Name = _.ToString() }).ToList();
}
  • 方案二:获取aList时立即转为列表
var aList = GetAList().ToList();

这样后续的遍历和修改操作都会针对同一批对象,修改后的Value会被保留在最终的列表中。

内容的提问来源于stack exchange,提问作者TeaLocust

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:01:05