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


Answers:


111

完全没有区别。第二个只是的简写Invoke,由编译器提供。它们编译为相同的IL。


1
保留Invoke()方法会导致编译器错误:“无法将类型'System.Func <T>'隐式转换为'T'”。我对编译.NET 4
麦克

2
@Mike:如果您也错过了方括号,那就会发生这种情况,即尝试返回(T)method而不是(T)method()
乔恩·斯基特

@JonSkeet因此,这里是这个家伙错误:social.msdn.microsoft.com/Forums/en-US/...
superlogical

4
@superologic:这里有两个问题。首先,问题在于直接调用方法和通过委托调用方法之间的区别。这是不一样的之间的差foo()foo.Invoke()在那里foo是一个代表类型的变量。另一个问题是答案似乎在谈论Control.Invoke,这与调用Invoke委托不同。
乔恩·斯基特

2
@LucaCremonesi:如果是方法调用的结果,我通常会喜欢InvokeGetAction()()看起来很奇怪,但是GetAction().Invoke()看起来还可以。但在大多数情况下,我都不介意。
乔恩·斯基特

17

调用可以与新的C#6空传播运算符一起很好地工作,现在您可以

T result = method?.Invoke();

代替

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

您能说明一个有用的场景吗?教科书案正在引发事件。
Gusdor

1
例如,您可以具有一个可选的Func参数,如果未分配任何值,则该参数为default(Func),它为null,将被忽略。
奥斯丁·萨尔加特

1
这是事件和其他多播委托的常见情况-它们通常使用null初始化,并在调用后获得非null值+=。因此,如果您要触发事件并且不知道是否有任何订阅,则简洁的解决方案是致电?.Invoke(...)
Stop-cran
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.