C# foreach循环是否在迭代时复制IEnumerable的每个项?

C# foreach循环是否在迭代时复制IEnumerable的每个项?,c#,foreach,ienumerable,C#,Foreach,Ienumerable,我有一个foreach循环,如下所示 foreach (XYZ split in this.splits ) { // this code is inserted for debug purpose only bool check = object.ReferenceEquals(splits.First(), split); ..... } 当我在this.splits中有

我有一个
foreach
循环,如下所示

        foreach (XYZ split in this.splits )
        {
            // this code is inserted for debug purpose only
            bool check = object.ReferenceEquals(splits.First(), split);
            .....
        }

当我在
this.splits中有一个元素时,check返回false。我用其他方法检查过,检查总是返回false。知道为什么会发生这种情况吗?

取决于枚举器的实现方式。实现可以自由返回副本或对象本身。事实上,它可以返回它喜欢的任何东西;例如,
Enumerable.Range
返回一个数字序列,并且没有任何元素实际存储在任何位置。它们是动态生成的。如果返回类型是值类型,那么它肯定是某个内容的副本


此外,每次对对象调用
GetEnumerator
时,都不需要对象返回相同的序列。在您的代码示例中,它在
foreach
中执行一次,在您调用
时执行另一次。这些序列不需要等价。

取决于枚举器的实现方式。实现可以自由返回副本或对象本身。事实上,它可以返回它喜欢的任何东西;例如,
Enumerable.Range
返回一个数字序列,并且没有任何元素实际存储在任何位置。它们是动态生成的。如果返回类型是值类型,那么它肯定是某个内容的副本


此外,每次对对象调用
GetEnumerator
时,都不需要对象返回相同的序列。在您的代码示例中,它在
foreach
中执行一次,在您调用
时执行另一次。这些序列不需要相等。

谢谢。我很快检查了创建IEnumarable的地方,这是我在recs select new XYZ(rec)中从rec找到的。再次感谢你的帮助。谢谢你。我很快检查了IEnumarable的创建位置,这是我在recs select new XYZ(rec)中从rec找到的,再次感谢您的帮助。