2010-03-17 16 views
5

Tại sao trình xử lý sự kiện không bao giờ được gọi nếu nó được thêm vào trong vòng lặp trên một số không?Tại sao trình xử lý sự kiện không bao giờ được gọi nếu nó được thêm vào trong vòng lặp trên một số không?

Ví dụ:

IEnumerable<MyType> list = someCollection.Select(i => new MyType(i)); 

foreach (var item in list) 
item.PropertyChanged += item_PropertyChanged; <-- this never gets called 

Bu nếu danh sách được gán như

list = someCollection.Select(i => new MyType(i)).ToArray(); 

xử lý sự kiện nào được gọi ..

Tại sao? (Tôi tưởng tượng nó có một cái gì đó để làm với thực tế là một truy vấn LINQ là lười biếng, nhưng thực tế của looping thông qua kết quả là không đủ?)

Trả lời

3

Gọi Select của bạn đang tạo ra trường hợp mới MyType, có nghĩa là. ..

Khi list được gõ là IEnumerable<MyType> sau đó bạn đang làm việc với một chuỗi mới của mới đối tượng mỗi khi bạn liệt kê list. Các đối tượng mà bạn đang thêm trình xử lý sự kiện không phải là các đối tượng tương tự mà bạn đang thử nghiệm sau đó.

Khi list được gõ như MyType[] (bằng ToArray cuộc gọi) sau đó bạn đang làm việc với cùng bộ sưu tập của các đối tượng mỗi khi bạn liệt kê list. Các đối tượng mà bạn đang thêm trình xử lý sự kiện các đối tượng tương tự mà bạn đang thử nghiệm sau đó.

Các vấn đề liên quan