【发布时间】:2012-02-25 17:40:01
【问题描述】:
string newName = "new name";
int[] numbers = new int[] { 1, 2, 3 };
var people = numbers.Select(n => new Person()
{
Name = n.ToString()
});
foreach (var person in people)
{
person.Name = newName;
}
Debug.WriteLine(people.First().Name == newName); // returns false
我希望上面的行返回 true。为什么我不能在 foreach 循环中设置迭代变量的属性?
【问题讨论】:
-
这不是一个有效的副本,这与分配给循环变量无关。这是延迟执行的问题。
-
@M.Babcock 我不认为这是一个重复的问题。链接中的问题试图分配给迭代变量本身,而我的问题分配给迭代变量的属性。不过谢谢!
-
@M.Babcock,这不是那个问题的重复。这个问题是关于修改迭代器本身的,因为迭代器是不可变的,所以无法做到这一点。然而,没有什么能阻止修改迭代器的内容(参见stackoverflow.com/a/776780/495041)。这种行为的原因是变量 people 是 IQuerable ,它在 foreach 循环运行时执行一次,在调用 First() 时再次执行,如 stackoverflow.com/a/9123015/495041 中所述