2010-07-29 65 views
2

任何人都可以建議爲什麼這行代碼不能編譯?它產生CS1660來代替:十字線程調用編譯問題

s.run_button.Invoke((b) => { b.Enabled = false; }, 
new object[] { s.run_button }); 

Visual Studio中說:無法轉換lambda表達式鍵入「System.Delegate」,因爲它不是一個委託類型

回答

4

Lambda表達式本身沒有類型,並且不轉換爲System.DelegateInvoke方法的類型爲System.Delegate,因此它不會編譯,因爲lambda表達式沒有類型。您需要在此處提供明確的類型轉換

s.run_button.Invoke(
    (Action<Button>)((b) => { b.Enabled = false; }), 
    new object[] { s.run_button }); 
2

Invoke方法接受類型爲Delegate的參數。它是在拉姆達達進入我們的世界之前寫的。最簡單的解決方案是用一個Action包裝你的lambda。我不確定究竟是什麼類型的「b」(並且C#編譯器也沒有,因此錯誤),所以你必須明確地傳遞它。例如:

s.run_button.Invoke(new Action<Button>(b => b.Enabled = false), new object[] { s.run_button }); 
+0

謝謝,正是我所需要的。 – Segfault 2010-07-29 16:42:43