На самом деле выполнение не задерживается в вашем коде, потому что вы используете обычный return
.Таким образом, метод Baz
выполняется, возвращается и удаляется.Позже, когда вы будете перечислять результат, если этот механизм перечисления опирается на неуправляемые ресурсы, которые были удалены (что, скорее всего, имеет место в вашем примере), это не удастся.
Обходной путь прост: не предотвращайте отложенное выполнение с return
, а используйте yield return
.Это точное ключевое слово для отложенного выполнения.
Ваш метод становится таким:
IEnumerable<int> Baz()
{
using (var d = new SomeDisposableSource())
{
//return d.Select(e => e.Id); //Baaaad ! No proper deferred execution
foreach (var i in d.Select(e => e.Id)) yield return i; //Proper deferred execution
}
}
, и тогда все в порядке.using
не вызывает метод Dispose
до завершения перечисления.