Я пишу итератор, который должен передавать изменяемое целое число.
public IEnumerable<T> Foo(ref int valueThatMeansSomething)
{
// Stuff
yield return ...;
}
Это выводит меня из строя "Ошибка 476 Итераторы не могут иметь параметры ref или out".
Что мне нужно, так это целочисленное значение, которое должно быть изменено в итераторе и может использоваться вызывающей стороной итератора. Другими словами, все, что звонит Foo()
выше, хочет знать конечное значение valueThatMeansSomething
, и Foo()
может использовать его само. Действительно, я хочу, чтобы целое число было ссылочным типом, а не типом значения.
Единственное, о чем я могу думать, это написать класс, который инкапсулирует мое целое число и позволяет мне изменять его.
public class ValueWrapper<T>
where T : struct
{
public ValueWrapper(T item)
{
this.Item = item;
}
public T Item { get; set; }
}
Итак:
ValueWrapper<int> w = new ValueWrapper<int>(0);
foreach(T item in Foo(w))
{
// Do stuff
}
if (w.Item < 0) { /* Do stuff */ }
Есть ли какой-либо класс или механизм для обработки этого уже в BCL? Есть ли недостатки с ValueWrapper<T>
, предложенные выше?
(Мое фактическое использование более сложное, чем в примере выше, поэтому обработка переменной внутри моего цикла foreach
, которая вызывает Foo()
, не вариант. Точка.)