我有一个将自定义委托作为参数的函数,以实现以下目的:
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关键字一起传递”。
我在这里想念什么?
答案 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))