2013-04-30 30 views
52

Ich bin neugierig auf die Unterschiede zwischen dem Aufruf eines Func direkt vs Invoke() darauf verwenden. Ist da ein Unterschied ? Ist der erste, syntaktische Zucker, und ruft Invoke() darunter überhaupt auf?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(); 
} 

Oder bin ich auf dem Holzweg ganz :) Danke.

+0

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

Antwort

67

Es gibt keinen Unterschied. Die zweite ist nur eine Kurzform für Invoke, die vom Compiler bereitgestellt wird. Sie kompilieren zu derselben IL.

+0

Danke, Jon. Ich dachte, das wäre der Fall. – Tris

+0

Wenn die Methode Invoke() deaktiviert ist, führt dies zum Compilerfehler: "Typ 'System.Func ' kann nicht implizit in 'T' konvertiert werden." Ich kompiliere gegen .NET 4. – Mike

+1

@Mike: Das würde passieren, wenn Sie auch die * Klammern * aus - versäumt hätten - d. H. Versucht, '(T) Methode' anstelle von '(T) Methode()' zurückzugeben. –

2

Invoke funktioniert gut mit neuen C# 6 null Ausbreitungs Operator, jetzt kann u tun

T result = method?.Invoke(); 

statt

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

Können Sie ein Szenario veranschaulichen, in dem dies nützlich ist? Der Lehrbuchfall löst Ereignisse aus. – Gusdor

Verwandte Themen