protected IteratorAdvance<int> Advance;
public delegate void IteratorAdvance<T2>(out T2 itemIndex);
public IteratorBase()
{
Advance = delegate(out int i) { i++; }; // <--- here
}
上面是一个类的片段,它是许多类型循环的包装器。在下面的构造函数重载中,实例化器可以指定确定继续for循环的条件的方法,以及如何在每次迭代时修改该循环的控制值。
显然,最简单和最可能的用法是从0开始并递增1,直到达到数据源的最后一个索引。为此,我提供了默认方法和有效的初始值(在这种情况下是一个非常复杂的版本)
for(var i = 0; i < list.Count; i++)
这是构造函数:
public IteratorBase(IterationStyle style, Func<int, T1, bool> complete, IteratorAdvance<int> advance, bool onErrorAbort = true, int initialValue = 0)
{
Style = style;
InitialValue = initialValue;
Complete = complete;
Advance = advance;
AbortOnError = onErrorAbort;
}
问题在于我增加控制值,编译器想要在该范围内声明的变量(i)的默认值,并且因为它是out参数,所以不能接受默认值。 / p>
即使我将函数体移动到单独的方法,也存在同样的问题。我不能在for循环初始化之前初始化out参数。
case IterationStyle.For:
for (controlValue = InitialValue; !Complete(controlValue, item); Advance(out controlValue))
{
action.TargetItem = item = dataSource[controlValue];
if (!ActWrapper(action))
return false;
}
break;
我能想到的唯一解决方案是仅在方法的第一次调用时初始化out参数,这将涉及在方法的外部使用某种布尔值。我不认为自己更喜欢避免那种事情。事实证明它不起作用,所以我必须使控制值全局化。在我的尸体上。
通常,在这种情况下,这意味着您的方法是错误的。但我无法想到另一种方式。我希望你能。或者告诉我如何初始化out参数或给它一个默认值。
答案 0 :(得分:2)
以防万一其他人脑力不好,这是解决方案。使用参考而非输出。
Advance = delegate(ref int i) { i++; };