如何从调用方法中获得函数的返回值
本文关键字:函数 返回值 调用 方法 | 更新日期: 2023-09-27 18:13:32
我需要解释…为什么下面的代码给出一个:Parameter count mismatch
?
//...
public delegate int FindInRichTextBoxMethod(RichTextBox rtx, string target, int index);
public int FindInRichTextBox(RichTextBox rtx, string target, int index)
{
return rtx.Find(target, index, RichTextBoxFinds.None);
}
// ...
int start;
string tempState = "foo";
if (lista.InvokeRequired) {
object find = Invoke((FindInRichTextBoxMethod)delegate
{
return FindInRichTextBox(list, tempState, len);
});
start = (int)find;
} else {
start = FindInRichTextBox(list, tempState, len);
}
Invoke()
的参数包括一个委托,以及传递给该委托的参数。您正在尝试传递一个FindInRichTextBoxMethod
委托,但该委托类型需要三个参数。你需要:
- 用你的
FindInRichTextBox
方法构造一个委托,然后 - 将参数传递给该委托。
像这样:
var finder = new FindInRichTextBoxMethod(FindInRichTextBox);
object find = Invoke(finder, new object[] { list, tempState, len });
另一种方法是传入闭包,就像您在示例中尝试的那样。在您的情况下,错误是由于强制转换为FindInRichTextBoxMethod
,因此调用正在等待参数。相反,您可以忽略强制转换,并传入一个匿名委托,如下所示:
var find = Invoke(delegate { return FindInRichTextBox(list, tempState, len); });
这是行不通的,因为编译器不能确定你想用那个匿名委托做什么。类似地,lambda也不能自动转换:
var find = Invoke(() => FindInRichTextBox(list, tempState, len));
要了解为什么以及如何解决这个问题,请阅读为什么在作为普通Delegate参数提供时必须强制转换lambda表达式。
你在调用中得到这个吗?我通常传递Invoke一个委托,然后是一个对象数组,其中包含你想传递的变量