2015-08-08 4 views
5

Ho problemi con un delegato anonimo lambda in C#. Ho appena convertito l'app in C# 5 e i delegati sono andato su tutte le furie. Qualsiasi aiuto sarebbe grande. L'errore specifico è:Impossibile convertire espressione lambda in tipo "Delega" perché non è un tipo delegato

Impossibile convertire espressione lambda al tipo 'delegato' perché non è un tipo delegato

public void UpdateUserList() 
{ 
    if (!Monitor.TryEnter((object)this.LvPerson, 150)) 
     return; 

    if (this.InvokeRequired) 
    { 
     this.Invoke((Delegate) (() => this.UpdateUserList()));    
    } 
    else 
    { ... } 
} 

Ho anche provato

this.Invoke(() => {this.UpdateUserList();}); 

I' Non sono sicuro di dove si trova il problema, in quanto ciò funzionava prima di spostare il progetto da Visual Studio 2008 a Visual Studio 2015.

Grazie ancora per l'aiuto!

+0

a cosa si riferisce questo? qual è la firma del metodo di Invoke()? – kai

+0

Ha funzionato davvero? Le espressioni Lambda non sono convertibili in Delegato AFAIK. Mai stato. – usr

+0

Possibile duplicato di [Impossibile convertire espressione lambda per digitare 'System.Delegate'] (http://stackoverflow.com/questions/9549358/cannot-convert-lambda-expression-to-type-system-delegate) –

risposta

10

Il metodo Invoke si aspetta un'istanza di tipo Delegate, poiché si utilizza un'espressione lambda che non può tradurre automaticamente l'espressione in qualcosa di simile a Delegate() perché il Delegato non ha costruttori pubblici. Utilizzo di

this.Invoke(new Action(() => {this.UpdateUserList();})); 

Dovrebbe risolvere il problema poiché Action è una sottoclasse di Delegate. Per eliminare la nuova azione ridondante (...) quando si utilizza Invoke è possibile scrivere una serie di metodi di estensione che considerano come argomento un'azione, in questo modo la nuova azione (...) verrà gestita dal compilatore C# in modo da non dovrai scriverlo ogni volta per rendere il tuo codice più pulito.

Nel caso in cui si utilizzi Invoke per alcune operazioni asincrone che potrebbero coinvolgere altri thread in TPL (Task Parallel Library) e TAP (Task-based Asynchronous Pattern), quest'ultimo ha incorporato il supporto in C# e Visual Basic.NET , l'attesa non richiede più una chiamata a Invoke() e consente di eseguire alcune operazioni sullo sfondo liberando l'interfaccia utente.

+0

Questo ha funzionato. Una buona idea per mettere questa è un'estensione. Potrei effettivamente costruirlo in alcune delle librerie che ho già impostato. Non ho aggiornato questo codice dal 2011. –