2013-04-30 5 views
52

Мне интересно узнать о различиях между вызовом Func напрямую и использованием Invoke(). Есть ли разница? Является первым, синтаксическим сахаром, и вызывает Invoke() под любым способом?Func <T>() vs Func <T> .Invoke()

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

против

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

Или я на ложном пути целиком :) Спасибо.

+0

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

ответ

67

Нет никакой разницы. Второй - это только сокращение от Invoke, предоставляемое компилятором. Они скомпилируются с тем же ИЛ.

+0

Спасибо, Джон. Я думал, это так. – Tris

+0

Выход из метода Invoke() выключен в результате ошибки компилятора: «Невозможно неявно преобразовать тип« System.Func »в« T ». Я компилирую против .NET 4. – Mike

+1

@Mike: Это произойдет, если вы также упустили * скобки *, а затем попытались вернуть метод '(T)', а не метод (T)(). –

2

Invoke хорошо работает с новым C# оператора распространения 6 нуля, теперь и может сделать

T result = method?.Invoke(); 

вместо

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

Можете ли вы проиллюстрировать сценарий, когда это полезно? В случае с учебником возникают события. – Gusdor

Смежные вопросы