鉴于以下MSDN示例代码,为什么我不能定义Action委托“inline”:
public static void Main(string[] args)
{
Action someAction = () => Console.WriteLine("Hello from the thread pool!");
Task.Factory.StartNew(someAction);
}
......所以“内联”如:
public static void Main(string[] args)
{
Task.Factory.StartNew(Action someAction = () => Console.WriteLine("etc."));
}
谢谢,
斯科特
答案 0 :(得分:13)
这不是有效的C#:
public static void Main(string[] args)
{
Task.Factory.StartNew(Action someAction = () => Console.WriteLine("etc."));
}
请改为:
public static void Main(string[] args)
{
Task.Factory.StartNew(() => Console.WriteLine("etc."));
}
答案 1 :(得分:4)
您正尝试在方法调用中委派变量。只是删除变量声明可能没问题:
public static void Main(string[] args)
{
Task.Factory.StartNew(() => Console.WriteLine("etc."));
}
这里Action
不是从lambda表达式本身推断出来的,而是来自它试图制作的方法调用。执行正常的重载决策,编译器尝试将lambda表达式转换为相关的参数类型。如果参数类型只是Delegate
(例如Control.Invoke
),则类型推断将失败,因为编译器没有任何具体的目标类型可以尝试转换为。
如果这不起作用(我无法轻易测试它),那么你只需要一个强制转换来告诉它应该将lambda表达式转换为哪个委托类型:
public static void Main(string[] args)
{
Task.Factory.StartNew((Action)(() => Console.WriteLine("etc.")));
}
说实话,在这一点上,我更愿意在可读性方面看到一个单独的变量。
答案 2 :(得分:2)
您要包含声明声明,该声明不是合法表达。试试:
Task.Factory.StartNew(() => Console.WriteLine("etc."));
如果您调用的API无法推断出委托的类型,您可以使用强制转换或明确调用委托构造函数:
Task.Factory.StartNew((Action)(() => Console.WriteLine("etc.")));
Task.Factory.StartNew(new Action(() => Console.WriteLine("etc.")));
答案 3 :(得分:1)
我不知道,但我认为你可以这样做:
public static void Main(string[] args)
{
Task.Factory.StartNew(delegate() {Console.WriteLine("etc.");});
}