Почему обработчик событий никогда не становится названным, если он добавляется в цикле на ienumerable?
Например:
IEnumerable list = someCollection.Select(i => new MyType(i));
foreach (var item in list)
item.PropertyChanged += item_PropertyChanged; <-- this never gets called
Bu, если как список присваивают
list = someCollection.Select(i => new MyType(i)).ToArray();
обработчик событий действительно становится названным..
Почему? (Я предполагаю, что это имеет некоторое отношение к тому, что запрос LINQ ленив, но факт цикличного выполнения через результат не достаточно?)
Ваш вызов Select
создает новые экземпляры MyType
, что означает. ..
Когда list
типизирован как IEnumerable
, вы имеете дело с новой последовательностью new объектов каждый раз, когда перечисляете list
. Объекты, к которым вы добавляете обработчики событий не являются теми же самыми объектами, которые вы впоследствии тестируете.
Когда list
типизирован как MyType[]
(с помощью вызова ToArray
), вы имеете дело с одной и той же коллекцией объектов при каждом перечислении list
. Объекты, к которым вы добавляете обработчики событий являются теми же самыми объектами, которые вы впоследствии тестируете.