如何从调用方法中获得函数的返回值

本文关键字:函数 返回值 调用 方法 | 更新日期: 2023-09-27 18:13:32

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

如何从调用方法中获得函数的返回值

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

  1. 用你的FindInRichTextBox方法构造一个委托,然后
  2. 将参数传递给该委托。

像这样:

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一个委托,然后是一个对象数组,其中包含你想传递的变量