C# - 为委托操作的out参数设置默认值

时间:2017-10-23 18:24:01

标签: c# default-value

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参数或给它一个默认值。

1 个答案:

答案 0 :(得分:2)

以防万一其他人脑力不好,这是解决方案。使用参考而非输出

 Advance = delegate(ref int i) { i++; };