为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
交互式爱情 2021-12-05 16:52:50
我有一个将自定义委托作为参数的函数,以实现以下目的: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 关键字一起传递”。我在这里错过了什么?
查看完整描述

3 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

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

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

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


查看完整回答
反对 回复 2021-12-05
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

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


查看完整回答
反对 回复 2021-12-05
?
喵喔喔

TA贡献1735条经验 获得超5个赞

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

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

并这样称呼它:

if (tryParse(cellValue, out values))


查看完整回答
反对 回复 2021-12-05
  • 3 回答
  • 0 关注
  • 166 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信