people
là định nghĩa truy vấn có thực thi hoãn lại. Tìm kiếm của bạn trên truy vấn không liên quan, điều này không phải là về việc không thể thiết lập thuộc tính. Khi bạn gọi First()
, bạn chạy lại truy vấn.
Để rõ ràng, định nghĩa truy vấn ở đây là cho các phần tử bằng số, tạo một Person mới và gán giá trị của phần tử số hiện tại vào thuộc tính Name của Person. Khi bạn lặp lại trong vòng lặp foreach, truy vấn sẽ đánh giá và bạn tạo các đối tượng Person mới. Nhưng những đối tượng Person đó không có trong truy vấn, nó chỉ là một định nghĩa! Chạy truy vấn lại thực hiện lại định nghĩa, tạo ra các đối tượng Person khác nhau. Thực tế là bạn đã sửa đổi kết quả ban đầu của truy vấn không ảnh hưởng đến tập kết quả thứ hai.
Nếu bạn muốn một thực hiện ngay lập tức, sử dụng
var people = numbers.Select(n => new Person()
{
Name = n.ToString()
}).ToList();
Bạn sẽ tìm thấy những thay đổi của bạn trong gắn bó vòng lặp, bởi vì bây giờ people
là danh sách cụ thể thay vì một định nghĩa truy vấn.
foreach (var person in people)
{
person.Name = newName;
}
Debug.WriteLine(people.First().Name.Equals(newName)); // returns true
Nguồn
2012-02-03 02:41:47
bản sao của: http://stackoverflow.com/questions/776430/why-is-the-iteration-variable-in-ac-sharp-foreach-statement-read-only –
Đó không phải là một giá trị trùng lặp, đây không phải là về việc gán cho biến vòng lặp. Đây là một vấn đề thực hiện hoãn lại. –
@ M.Babcock Tôi không nghĩ đó là câu hỏi trùng lặp. câu hỏi trong liên kết cố gắng gán cho biến lặp chính nó, trong khi câu hỏi của tôi gán cho thuộc tính varaible của iteration. nhưng cảm ơn! – Yeonho