为什么事件处理程序永远不会被调用,如果它被添加到一个不可数的循环中?

And*_*lho 5 .net ienumerable

为什么事件处理程序永远不会被调用,如果它被添加到一个不可数的循环中?

例如:

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

foreach (var item in list)
item.PropertyChanged += item_PropertyChanged; <-- this never gets called
Run Code Online (Sandbox Code Playgroud)

Bu如果分配列表就像

list = someCollection.Select(i => new MyType(i)).ToArray();
Run Code Online (Sandbox Code Playgroud)

事件处理程序确实被调用..

为什么?(我想它与LINQ查询是懒惰的事实有关,但循环结果的事实是不够的?)

Luk*_*keH 3

您的Select调用正在创建 的新实例MyType,这意味着......

list输入When时,每次枚举时IEnumerable<MyType>都会处理对象的新序列。您要添加事件处理程序的对象与您随后测试的对象不同list

list键入为MyType[](通过使用调用)时,每次枚举时ToArray都会处理相同的对象集合list。您要添加事件处理程序的对象您随后测试的对象相同。