2009-12-05 61 views
1

我有這樣的代碼:我如何使這個lambda工作?

 String temp = txtForm.Rtf; 

     foreach (ReplaceStrut rs in replaceArray) { 
      temp = temp.Replace(rs.getNeedle(), rs.getReplacement()); 
     } 
     if (this.InvokeRequired) { 
      this.Invoke(temp => txtForm.Rtf = temp); 
     } else { 
      txtForm.Rtf = temp; 
     } 

但它不會編譯。它抱怨兩件事:「不能將lambda表達式轉換爲類型'System.Delegate',因爲它不是一個委託類型」,並且「一個名爲'temp'的局部變量不能在這個範圍內聲明,因爲它會帶來不同的意義'temp',已經在'父級或當前'範圍內用於表示其他內容'

這兩個錯誤都在lambda行上。我該如何做這項工作,我做錯了什麼?

回答

5
this.Invoke(new Action(() => txtForm.Rtf = temp)) 
+0

從來沒有見過這樣的語法:p不知道如果我喜歡它。 – leppie 2009-12-05 16:31:52

+1

'new Action((=)...>)語法在生成的IL到'(Action)((=> ...>)'方面是相同的。 – 2009-12-05 16:58:49

0
this.Invoke((Action)() => txtForm.Rtf = something); // where something is free 
+1

這不起作用。我發現lamba實際上有權訪問當前的作用域變量,因此傳遞它的temp是不必要的。修正你的答案,我將它標記爲合適的一個 – Malfist 2009-12-05 16:24:45

+0

好點:)顯然有些參數必須通過然後:p – leppie 2009-12-05 16:30:27

+0

不,你必須使用溫度,而不是'某些東西在任何範圍內,因此它必須通過。 – Malfist 2009-12-05 16:35:51

6

的「不能轉換lambda表達式爲類型‘System.Delegate’,因爲它不是委託類型」的錯誤正在發生,因爲lambda表達式沒有類型。編譯器通常會從作業的目標中推斷出類型,但這不適用於Invoke,因爲它需要System.Delegate。投射lambda表達式可以解決這個問題。

沒有必要聲明temp作爲您的lambda表達式的參數。該表達式將能夠從包含範圍引用temp

Invoke行更改爲以下,它應該工作:

this.Invoke((Action)(() => txtForm.Rtf = temp)); 

確保你引用的System.Core大會上線,否則你會得到一個錯誤說「使用泛型類型' System.Action'需要'1'類型參數「。

+0

+1爲解釋 – Davy8 2009-12-05 16:43:44