Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在更改IEnumerator的属性<;T>;。现在的_C#_Ienumerable - Fatal编程技术网

C# 正在更改IEnumerator的属性<;T>;。现在的

C# 正在更改IEnumerator的属性<;T>;。现在的,c#,ienumerable,C#,Ienumerable,今天我非常惊讶地观察到以下行为:上课 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); //

今天我非常惊讶地观察到以下行为:上课

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
IEnumerable foos=Enumerable.Range(0,3)。选择(new Foo());
foreach(foos中的var foo)
foo.Bar=5;
foreach(foos中的var foo)
Console.Write(foo.Bar);//写000
当初始化
foos
new List{new Foo(),new Foo(),new Foo()}
时,循环写入“555”


我的问题:为什么会发生这种情况?有没有一种方法可以避免这种情况,而不用使用
.ToList()
(它需要注释,因为这里似乎不需要注释)。

之所以会发生这种情况,是因为
foos
是在每次枚举时动态生成的。因此,在第一次迭代期间,您将在迭代结束后不再被任何对象引用的对象上设置属性值。第二次迭代处理具有默认属性值的新构造对象

foos
初始化为一个“持久”对象列表会改变事情,使用
.ToList()
也是出于同样的原因(构建一个“固定”列表并迭代两次;动态生成的原始
IEnumerable
只迭代一次)


已经确定您应该在这里使用
.ToList()
:一般来说,我觉得它不需要注释,因为在动态生成的序列上迭代多次是不习惯的(我相信许多代码分析工具都会对此发出警告),但无论如何都要写一个。

发生的事情似乎很明显:每次枚举时,都是在实例化新的Foo对象


如果您希望保留属性值(
Foo.Bar
),则必须将Foo保留在某个地方,而ToList()是一种简单的方法。

欢迎来到ReSharper称之为“可能的多重枚举”的奇妙世界。可枚举项不是集合。有时候,一个可枚举项位于集合上方,而您可以在其下方对其进行修改,这是一个副作用。这就解释了这一点,谢谢。我的错误印象是,在第一次枚举之后,结果会存储在某个地方。