2013-04-30 16 views
52

Sono curioso delle differenze tra chiamare direttamente un Func o utilizzare Invoke(). C'è una differenza? È il primo, zucchero sintattico e chiama Invoke() sotto comunque?Func <T>() vs Func <T> .Invoke()

public T DoWork<T>(Func<T> method) 
{ 
    return (T)method.Invoke(); 
} 

vs

public T DoWork<T>(Func<T> method) 
{ 
    return (T)method(); 
} 

O sono sulla strada sbagliata del tutto :) Grazie.

+0

http://social.msdn.microsoft.com/Forums/en- US/csharplanguage/thread/f629c34d-6523-433a-90b3-bb5d445c5587 –

risposta

67

Non c'è alcuna differenza. Il secondo è solo una scorciatoia per Invoke, fornita dal compilatore. Si compilano con lo stesso IL.

+0

Grazie, Jon. Ho pensato che fosse il caso. – Tris

+0

Lasciando spento il metodo Invoke() si ottiene l'errore del compilatore: "Impossibile convertire implicitamente il tipo 'System.Func ' in 'T'". Mi sto occupando di .NET 4. – Mike

+1

@Mike: Ciò accadrebbe se ti fossi perso anche le * parentesi *, cioè provassi a restituire il metodo '(T)' piuttosto che il metodo '(T)()'. –

2

Invoke funziona bene con nuovo C# 6 nullo operatore propagazione, ora u può fare

T result = method?.Invoke(); 

anziché

T result = method != null ? method() : null; 
+0

Puoi illustrare uno scenario in cui è utile? Il caso da manuale sta sollevando eventi. – Gusdor

Problemi correlati