【问题标题】:C# - setting a default value for an out parameter of a delegate actionC# - 为委托操作的输出参数设置默认值
【发布时间】: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


【解决方案1】:

以防万一其他人的大脑一天不好,这就是解决方案。使用 ref 而不是 out

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

【讨论】:

    猜你喜欢
    • 2013-10-07
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 2014-09-18
    • 2021-12-24
    • 2013-06-28
    • 2019-01-26
    • 2011-02-13
    相关资源
    最近更新 更多