2011-11-03 52 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調用中收到此消息?我通常會傳入一個委託,然後傳入一個包含要傳遞的變量的對象數組。

相關問題