2013-04-30 15 views
52

Jestem ciekawy różnic między wywołaniem Func bezpośrednio vs za pomocą Invoke() na nim. Czy istnieje różnica? Czy pierwszy, syntaktyczny cukier, i wywołuje Invoke() pod spodem?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(); 
} 

Albo jestem na niewłaściwym torze całkowicie :) Dzięki.

+0

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

Odpowiedz

67

Nie ma żadnej różnicy. Drugi jest skrótem dla Invoke dostarczonym przez kompilator. Kompilują się do tej samej IL.

+0

Dzięki, Jon. Myślałem, że tak było. – Tris

+0

Pozostawienie metody Invoke() wyłącza się, powodując błąd kompilatora: "Nie można niejawnie przekonwertować typu" System.Func "na" T "". Kompiluję przeciwko .NET 4. – Mike

+1

@Mike: Tak by się stało, gdybyś pominął również * nawiasy * - tzn. Próbował zwrócić '(T) method' zamiast' (T) method() '. –

2

Wywołanie dobrze nowe C# 6 pustego operatora propagacji teraz można u do

T result = method?.Invoke(); 

zamiast

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

Czy możesz zilustrować scenariusz, w którym jest to przydatne? Przypadek podręcznika podnosi wydarzenia. – Gusdor