【发布时间】:2018-04-04 09:31:03
【问题描述】:
protected IteratorAdvance<int> Advance;
public delegate void IteratorAdvance<T2>(out T2 itemIndex);
public IteratorBase()
{
Advance = delegate(out int i) { i++; }; // <--- here
}
上面是一个类的sn-p,它是许多类型循环的包装器。在下面的构造函数重载中,实例化器可以指定确定继续 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) 的默认值,并且因为它是一个输出参数,所以不能接受默认值。
即使我将函数体移到单独的方法中,也会存在同样的问题。我无法在 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 参数,这将涉及使用方法外部的某种布尔值。我不认为只有我一个人更愿意避免这种事情。事实证明这也不起作用,所以我必须将控制值设为全局。越过我的尸体。
通常,在这种情况下,这意味着您的方法是错误的。但我想不出别的办法。我希望你能。或者告诉我如何初始化一个输出参数或给它一个默认值。
【问题讨论】:
-
不,这没有帮助。答案很简单。我应该使用 ref 不出来。哦!
-
啊,参考。是的。我打算建议:)
标签: c# default-value