2014-09-19 24 views
1

我得到Cannot convert lambda expression to type 'System.Delegate'出錯:無法轉換lambda表達式鍵入「System.Delegate」,而調用

this.Dispatcher.Invoke((Delegate)(() => 
      { 
       this.Focus(); 
       if (!moveFocus) 
        return; 
       this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); 
      }), DispatcherPriority.Background, new object[0]); 

我擡頭所有文章這件事,但我無法弄清楚/明白爲什麼?並且答案也沒有解決我的問題。

回答

6

Lambda表達式不能直接投射到Delegate。但是,如果方法需要某種類型的代理(例如Action),那麼您可以在不投射的情況下使用lambda表達式。例如,在.NET 4.5存在的超載:

public void Invoke(Action callback,DispatcherPriority priority) 

,這意味着你可以這樣做:

this.Dispatcher.Invoke(() => 
     { 
      //... 
     }, DispatcherPriority.Background); 

但超載不淨4或之前存在。所以,你必須強制轉換爲Action

this.Dispatcher.Invoke((Action)(() => 
    { 
     ... 
    }), DispatcherPriority.Background); 

注意,我刪除了new object[0]。這是不需要的,因爲Action不採用任何參數。

+1

現在更清晰(Y) – Enumy 2014-09-19 09:53:40

+1

很好解釋Eren :) +1 – 2014-09-19 09:55:10

4

不要投給DelegateAction

this.Dispatcher.Invoke((Action)(() => 
     { 
      ... 
     }), DispatcherPriority.Background, new object[0]); 
+0

好吧,這很奇怪,因爲當我使用'新行動'它也沒有工作,但'(行動)'工作!無論如何,請解釋爲什麼不使用'代表'? – Enumy 2014-09-19 09:40:22

+0

'新行動'也一樣。這裏也可以使用:'Invoke(new Action((=)'> – 2014-09-19 09:42:55

+0

)你可以編寫一些擴展方法來允許'Invoke(()=>'工作 – 2014-09-19 09:44:28

1

你不需要投委託lambda表達式由編譯器隱式澆鑄爲委託類型

this.Dispatcher.Invoke(() => 
      { 
       this.Focus(); 
       if (!moveFocus) 
        return; 
       this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); 
      }, DispatcherPriority.Background); 
+0

不起作用:「不能轉換lambda表達式鍵入'System.Delegate',因爲它不是委託類型」 – 2014-09-19 09:42:18

+0

這是正確的,它給出了相同的錯誤 – Enumy 2014-09-19 09:43:27

+0

是的,它確實如果你省略了新的對象[0],這裏沒有意義 – 2014-09-19 09:47:36

相關問題