委托的 C# 输出参数不保持值

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


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 后仍然为空(并且在 TryParseName 方法内部时正确更新)。我尝试将 out 关键字添加到值中,但出现错误“参数 2 可能无法与 out 关键字一起传递”。


我在这里错过了什么?


交互式爱情
浏览 167回答 3
3回答

白衣非少年

我尝试将 out 关键字添加到值中,但出现错误“参数 2 可能无法与 out 关键字一起传递”这是因为您需要先更改委托。delegate&nbsp;T&nbsp;TryParseDelegate<I,&nbsp;O,&nbsp;T>(I&nbsp;input,&nbsp;out&nbsp;O&nbsp;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&nbsp;T&nbsp;TryParseDelegate<I,&nbsp;O,&nbsp;T>(I&nbsp;input,&nbsp;out&nbsp;O&nbsp;output); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//^^^&nbsp;Add&nbsp;this并这样称呼它:if&nbsp;(tryParse(cellValue,&nbsp;out&nbsp;values))
打开App,查看更多内容
随时随地看视频慕课网APP