委托的 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))
我有一个函数将自定义委托作为参数以实现以下目的:
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))