为什么我不能在期望委托的方法中定义一个Action?

时间:2010-07-05 13:00:24

标签: delegates c#-4.0 action

鉴于以下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."));
}

谢谢,

斯科特

4 个答案:

答案 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.");});
}
相关问题