Why does an event handler never get called if it's added within a loop on an ienumerable?
For instance:
IEnumerable<MyType> list = someCollection.Select(i => new MyType(i));
foreach (var item in list)
item.PropertyChanged += item_Proper开发者_Python百科tyChanged; <-- this never gets called
Bu if list is assigned like
list = someCollection.Select(i => new MyType(i)).ToArray();
the event handler does get called..
Why? (I imagine it has something to do with the fact that a LINQ query is lazy, but the fact of looping through the result isn't enough?)
Your Select
call is creating new instances of MyType
, which means that...
When list
is typed as IEnumerable<MyType>
then you're dealing with a new sequence of new objects each time you enumerate list
. The objects to which you're adding event handlers are not the same objects that you're subsequently testing.
When list
is typed as MyType[]
(by using the ToArray
call) then you're dealing with the same collection of objects each time you enumerate list
. The objects to which you're adding event handlers are the same objects that you're subsequently testing.
精彩评论