Учитывая IEnumerable<IDisposable>
(с или без Async
в нем), нет никаких правил относительно того, кто должен располагать элементами. И поэтому (и, мы надеемся), перечисление его не приведет к уничтожению его элемента.
Утилизация элементов - ваша ответственность.
В вашем вопросе вы хотите, чтобы они были удалены, итерация, поэтому вариант 3 не возможно, вы должны избавиться от них самостоятельно.
Варианты 1 и 2 эквивалентны, но оба вонючие.
Вы можете написать:
await foreach (var item in enumerable)
{
await using (item)
{
..
}
}
// by playing with your autoformatter
await foreach (var item in enumerable) await using (item)
{
..
}
К сожалению, я не сделал не вижу лучшего решения. И похоже, что вы должны быть осторожны, если работаете с ValueType. Может быть, мы должны попросить что-то вроде этого:
await foreach(await using var e in c)
Редактировать конечно кто-то уже попросил об этом .