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

为何示例中foo与bar的Count()结果不同?bar不是foo的引用吗?

为何foo与bar的Count()结果不一致?

先看你给出的代码:

IEnumerable<string> foo = new List<string> { "a", "b" };
var bar = foo;
foo = foo.Skip(1);

// foo.Count() = 1
// bar.Count() = 2

核心问题出在引用类型变量的赋值逻辑上:

  • 一开始foo指向的是一个包含两个元素的List<string>对象。
  • 执行bar = foo后,bar和foo确实指向同一个List实例,这时候两者是“同一份引用”。
  • 关键是第三步foo = foo.Skip(1):Skip()方法不会修改原来的List,它会返回一个全新的IEnumerable<string>实例,这个实例代表的是跳过原集合第一个元素后的序列。这时候foo变量的引用被替换成了这个新实例,但bar还是牢牢指向最初的那个List对象。

所以最后调用Count()时:

  • foo.Count()统计的是Skip返回的新序列的长度,结果是1。
  • bar.Count()统计的是最初那个List的元素数量,结果是2。

说白了就是:bar存的是最初List的引用,而foo后来被重新赋值成了新的序列,两者指向的已经不是同一个对象了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 06:00:55