Почему обработчик событий никогда не становится названным, если он добавляется в цикле на ienumerable?

Почему обработчик событий никогда не становится названным, если он добавляется в цикле на 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 ленив, но факт цикличного выполнения через результат не достаточно?)

5
задан Peter Mortensen 17 March 2010 в 15:58
поделиться

1 ответ

Ваш вызов Select создает новые экземпляры MyType, что означает. ..

Когда list типизирован как IEnumerable, вы имеете дело с новой последовательностью new объектов каждый раз, когда перечисляете list. Объекты, к которым вы добавляете обработчики событий не являются теми же самыми объектами, которые вы впоследствии тестируете.

Когда list типизирован как MyType[] (с помощью вызова ToArray), вы имеете дело с одной и той же коллекцией объектов при каждом перечислении list. Объекты, к которым вы добавляете обработчики событий являются теми же самыми объектами, которые вы впоследствии тестируете.

3
ответ дан 15 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: