怀着极大的惊讶,我今天观察到以下行为:给定一个类改变属性.Current
class Foo
{
prop int FooNumber { get; set; }
}
和验证码
IEnumerable<Foo> foos = Enumerable.Range(0,3).Select(new Foo());
foreach (var foo in foos)
foo.Bar = 5;
foreach (var foo in foos)
Console.Write(foo.Bar); // Writes 000
同时初始化foos
到new List<Foo>{ new Foo(), new Foo(), new Foo() }
使循环写入“ 555" 。
我的问题:为什么会发生这种情况,并且有没有办法使用.ToList()
(需要注释,因为在这里似乎不需要)来绕过这个问题。
欢迎来到ReSharper称之为“可能的多重枚举”的奇妙世界。一个枚举是**不是**集合。事实上,有时一个枚举可以覆盖集合,并且您可以在下面修改它,这是一个副作用。 – 2012-07-10 10:20:14