2011-11-03 131 views
1

我需要解释..为什么下面的代码给出了: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); 
} 

在此先感谢。

回答

2

参数Invoke()包括一个委托,以及传递给该委托的参数。您正试图通过FindInRichTextBoxMethod委托,但该委托类型有三个参数。您需要:

  1. 结构中的参数可以是委托一个与你FindInRichTextBox方法的委托,然后
  2. 通。

事情是这样的:

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); }); 

这是行不通的,不过,因为编译器不能确定你想要的是匿名委托该怎么做。同样,拉姆达不能自动转换之一:

var find = Invoke(() => FindInRichTextBox(list, tempState, len)); 

要知道为什么,以及如何解决这个问题,读Why must a lambda expression be cast when supplied as a plain Delegate parameter

0

您是否在Invoke调用中收到此消息?我通常会传入一个委托,然后传入一个包含要传递的变量的对象数组。

相关问题