Поскольку LoadItems
является ленивым перечислимым (использует yield
), и вы присваиваете его полю, это означает, что каждый раз, когда вы перечисляете _items
, вы фактически заставляете цикл внутри LoadItems()
запускаться снова , т. е. (Enumerable.Count
каждый раз создает новый Enumerator
, что приводит к повторному запуску тела LoadItems
). Поскольку вы не создаете устройство чтения заново каждый раз в пределах LoadItems
, его курсор будет расположен в конце потока, поэтому, скорее всего, не сможете читать больше строк - я подозреваю, что он возвращает null
и ваш единственный Item
объект, возвращаемый во втором вызове, содержит строку null
.
Решением этой проблемы будет «осознание» результата LoadItems
путем вызова Enumerable.ToList
, который даст вам конкретный список:
return _items ?? (_items = LoadItems().ToList());
Или поиск читателя в начале потока (если это возможно), чтобы LoadItems
мог запускаться снова каждый раз одинаково.
Но я бы порекомендовал вам просто избавиться от yield
в этом случае и вернуть конкретный список, так как вы получаете небольшую выгоду, поэтому вы платите цену за сложность без прибыли.