[英]C# - setting a default value for an out parameter of a delegate action
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参数,所以不能接受默认值。
即使我将函数的主体移到单独的方法上,也存在相同的问题。 我无法在for循环本身对其进行初始化之前对其进行初始化。
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参数或为它提供默认值。
以防万一其他人的大脑状况不好,这是解决方案。 使用ref not out 。
Advance = delegate(ref int i) { i++; };
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.