当我使用 Tasks 时,我遇到了这种语法:
class Program
{
static void TestMethod()
{
Console.WriteLine("Test");
}
static void Main(string[] args)
{
Task t = Task.Run(action: TestMethod); // Why this action: specifier
t.Wait();
Console.ReadKey();
}
}
如果我删除了action关键字,编译器会给出一条错误消息:
错误CS0121:以下方法之间的呼叫不明确或 属性:' System.Threading.Tasks.Task.Run(System.Action)'和 ' System.Threading.Tasks.Task.Run(System.Func)'
实际上,获取此类消息很奇怪,因为我们没有为我们传递的方法返回Type
,因此应将其视为Action
而不是Func<>
。
我知道还有很多其他方法可以解决这个错误,例如转换为Action
或匿名方法。但是,我无法理解action:
来自何处以及它的工作原理。
答案 0 :(得分:4)
这称为命名参数。它是c#语言的一个特性,它允许通过指定名称来以任意顺序指定函数调用的参数。有关详细信息,请参阅[https://msdn.microsoft.com/en-us/library/dd264739.aspx]。在您的情况下,它会使Run
的调用唯一,因为只有System.Threading.Tasks.Task.Run(System.Action)
变体有一个名为 action 的参数。
答案 1 :(得分:0)
data
是参数的名称。在这里,您基本上是在告诉编译器:这里有一些东西,现在我希望您将它放在名为'action'的参数中。由于在这种情况下,2个方法没有相同的参数名称,编译器能够理解您要调用哪个,因此没有它就会出现错误的原因。
附注:这也可以用于在调用函数时无序地给出参数,或者仅指定一些可选参数而忽略之前的其他参数。非常酷的功能。