委托的 C# out 参数不保持值

C# out parameter for delegate not maintaining value

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

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));

当我调试代码时,一切似乎都正常工作,除了 "values" 在通过 tryParse 后仍然为空(但在 TryParseName 方法内部时正确更新)。我尝试将 out 关键字添加到值中,但出现错误 "Argument 2 may not be passed with the out keyword".

我在这里错过了什么?

I tried adding the out keyword to values, but I get the error "Argument 2 may not be passed with the out keyword"

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

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

您需要将输出参​​数更改为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.

您尚未使用 out 参数定义委托。改成这样:

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

并这样称呼它:

if (tryParse(cellValue, out values))