我有一个将自定义委托作为参数的函数,以实现以下目的: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);
元芳怎么了
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.
喵喔喔
TA贡献1735条经验 获得超5个赞
您尚未使用out
参数定义您的委托。改成这样:
delegate T TryParseDelegate<I, O, T>(I input, out O output); //^^^ Add this
并这样称呼它:
if (tryParse(cellValue, out values))
- 3 回答
- 0 关注
- 166 浏览
添加回答
举报
0/150
提交
取消