我有一个foreach
循环,如下所示
foreach (XYZ split in this.splits )
{
// this code is inserted for debug purpose only
bool check = object.ReferenceEquals(splits.First(), split);
.....
}
当我在this.splits
中有单个元素时,检查返回false。我通过其他方式检查,检查总是返回false。知道为什么会这样吗?
答案 0 :(得分:5)
取决于枚举器的实现方式。实现可以自由返回副本或对象本身。事实上,它可以回报任何它喜欢的东西;例如,Enumerable.Range
返回一个数字序列,并且没有任何元素实际存储在任何地方。它们是在运行中生成的。如果返回类型是值类型,它肯定是某种东西的副本。
此外,每次调用GetEnumerator
时,都不需要对象返回相同的序列。在您的代码示例中,它会在foreach
中执行一次,而在您调用.First
时则会执行一次。这些序列不需要是等效的。