我需要解释..为什么下面的代码会给出:Parameter count mismatch
?
C#代码:
//...
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);
}
提前致谢。
答案 0 :(得分:2)
Invoke()
的参数包括一个委托,以及传递给该委托的参数。您尝试传递FindInRichTextBoxMethod
委托,但该委托类型需要三个参数。你需要:
FindInRichTextBox
方法构建委托,然后这样的事情:
var finder = new FindInRichTextBoxMethod(FindInRichTextBox);
object find = Invoke(finder, new object[] { list, tempState, len });
另一种方法是传递一个关闭,有点像你在你的样本中尝试。在您的情况下,错误是由于转换为FindInRichTextBoxMethod
,因此Invoke期待参数。相反,您可以忽略强制转换并传入一个匿名委托,如下所示:
var find = Invoke(delegate { return FindInRichTextBox(list, tempState, len); });
但是,这不会起作用,因为编译器无法准确确定您要对匿名委托做什么。同样,lambda也不能自动转换:
var find = Invoke(() => FindInRichTextBox(list, tempState, len));
要了解解决问题的原因和方法,请阅读Why must a lambda expression be cast when supplied as a plain Delegate parameter。
答案 1 :(得分:0)
您是否在Invoke来电中收到此消息?我通常传递Invoke一个委托,然后传递一个包含你想传递的变量的对象数组。