2013-04-30 12 views
52

Funcを直接呼び出して呼び出す方法と、それを呼び出す方法の違いについては興味があります。違いはありますか?最初の構文的な砂糖で、とにかくInvoke()を呼び出しますか?Func ()vs Func .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-を行うことができます米国/ csharplanguage/thread/f629c34d-6523-433a-90b3-bb5d445c5587 –

答えて

67

全く違いはありません。 2番目は、コンパイラによって提供されるInvokeの省略形です。それらは同じILにコンパイルされます。呼び出しは、新しいC#6ヌル伝播オペレータでうまく動作

+0

ありがとう、Jon。私はそれが事実だと思った。 – Tris

+0

Invoke()メソッドをオフにするとコンパイラエラーが発生します。「暗黙的に 'System.Funcタイプ'を 'T'に変換できません。私は.NET 4に対してコンパイルしています。 – Mike

+1

@Mike:*()メソッドではなく '(T)メソッドを返そうとしました。 –

2

、今uが

T result = method?.Invoke(); 

代わりの

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

これは便利なシナリオを説明できますか?教科書のケースは募集イベントです。 – Gusdor