繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM