开发者

Why does an event handler never get called if it's added within a loop on an ienumerable?

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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜