代表不维护值的C#out参数

时间:2018-08-20 15:55:17

标签: c# parameters delegates ref out

我有一个将自定义委托作为参数的函数,以实现以下目的:

delegate T TryParseDelegate<I,O,T>(I input, O output);

private string[] ReadMultiStringValue (string propertyName, TryParseDelegate<string, string[], bool> tryParse)
{
  string cellValue = GetCellValue(propertyName);
  string[] values = null;

  if (tryParse(cellValue, values))
    return values;
  else
    throw new Exception("Invalid cell value");
}

我会这样打电话:

string[] parsedValue = ReadMultiStringValue("myProperty", (n,p) => ParseHelper.TryParseName(n, out p));

当我调试代码时,一切似乎都能正常工作,除了通过tryParse后“ values”保持为空(并且在TryParseName方法内部正确更新)。我尝试将out关键字添加到值中,但是出现错误“参数2可能无法与out关键字一起传递”。

我在这里想念什么?

3 个答案:

答案 0 :(得分:1)

  

我尝试将out关键字添加到值中,但是出现错误“参数2可能无法与out关键字一起传递”

这是因为您需要先更改委托。

delegate T TryParseDelegate<I, O, T>(I input, out O output);

答案 1 :(得分:0)

您需要将输出参​​数更改为out参数,并像这样传递它:

delegate T TryParseDelegate<I,O,T>(I input, out O output);


if (tryParse(cellValue, out values))

没有out的情况就无法工作的原因是,当传递值时,引用被复制,然后将该引用作为out传递给TryParseName方法。但这并不会改变原始的values

这类似于这样做:

string x = "foo";
string y = x;
x = "bar"; // this won't change the y.

答案 2 :(得分:0)

您尚未使用out参数定义委托。更改为此:

delegate T TryParseDelegate<I, O, T>(I input, out O output);
                                            //^^^ Add this

并这样称呼它:

if (tryParse(cellValue, out values))