Func <T>()vs Func <T> .Invoke()

tri*_*ris 73 c# invoke func

我很好奇直接调用Func和使用Invoke()之间的区别.有区别吗?是第一个,语法糖,并在下面调用Invoke()?

public T DoWork<T>(Func<T> method)
{
    return (T)method.Invoke();
}
Run Code Online (Sandbox Code Playgroud)

VS

public T DoWork<T>(Func<T> method)
{
    return (T)method();
}
Run Code Online (Sandbox Code Playgroud)

或者我完全走错了轨道:)谢谢.

Jon*_*eet 99

根本没有区别.第二个只是Invoke编译器提供的简写.他们编译成同一个IL.

  • @superlogical:这里有两个问题.首先,问题是关于直接调用方法和通过委托调用方法之间的区别.这与`foo()`和`foo.Invoke()`之间的区别不一样,其中`foo`是委托类型的变量.另一个问题是*answer*似乎是在谈论`Control.Invoke`,这与在委托上调用`Invoke`不同. (4认同)
  • @Mike:如果您也错过了*括号*,就会发生这种情况-即尝试返回`(T)method`而不是`(T)method()`。 (2认同)
  • @LucaCremonesi:如果它是方法调用的结果,我通常喜欢`Invoke`,因为`GetAction()()`看起来很奇怪,但是`GetAction().Invoke()`看起来没问题.但在大多数情况下,我不介意任何一种方式. (2认同)

san*_*uro 12

调用适用于新的C#6空传播运算符,现在你可以做到

T result = method?.Invoke();
Run Code Online (Sandbox Code Playgroud)

代替

T result = method != null ? method() : null;
Run Code Online (Sandbox Code Playgroud)

  • 例如,您可以有一个可选的 Func 参数,如果未分配任何值,则为默认值 (Func),该参数为 null 并被忽略。 (2认同)