3
task.ContinueWith( x => Process(x));

task.ContinueWith( Process)

我想知道为什么两者都可以工作?

我以为 ContinueWith 至少需要一个 Task 参数

4

4 回答 4

5

lambda 表达式正在转换为方法组。

13.6 方法组转换

与第 13.5 节中描述的隐式匿名方法转换类似,存在从方法组(第 14.1 节)到兼容委托类型的隐式转换。如果 D 是委托类型,并且 E 是分类为方法组的表达式,则 D 与 E 兼容当且仅当 E 包含至少一个适用于其正常形式(第 14.4.2.1 节)的方法具有与 D 的参数类型和修饰符匹配的类型和修饰符的任何参数列表(第 14.4.1 节)。

从 E 到 D 的转换的编译时应用与委托创建表达式 new D(E) (§14.5.10.3) 的编译时处理相同。请注意,从 E 到 D 的隐式转换的存在只是表明适用方法的集合不为空,但不能保证转换的编译时应用程序会成功而不会出错。

有关示例,请参见http://en.csharp-online.net/ECMA-334:_13.6_Method_group_conversions

于 2012-10-13T00:12:35.737 回答
0

这两条线本质上是一回事。下面是一个方法调用,它上面的 lambda 表达式只是被转换成一个类似的方法调用。一样的,只是表达方式不同。

于 2012-10-13T00:13:44.680 回答
0

因为ContinueWith需要一个Action<Task>as 参数并且Process具有正确的签名以及(x) => Process(x).

于 2012-10-13T00:15:52.443 回答
0

x => Process(x) 正在创建一个委托。

委托是一种引用方法的类型。

Task 表示异步操作。

Action 是一种委托。

于 2012-10-13T00:16:12.093 回答