为什么不能推断出委托参数的类型?

时间:2014-01-10 14:19:10

标签: c# lambda delegates

我可以这样写:

new Thread(new ParameterizedThreadStart((x) =>  //**parameter type not specified explicitly**
{
    for (int j = 0; j < Convert.ToInt32(x); j++)
    {
        Console.WriteLine(j);
    }
})).Start(5);

我可以这样写:

new Thread(new ParameterizedThreadStart(delegate(object x) //**parameter type specified explicitly**
{
    for (int j = 0; j < Convert.ToInt32(x); j++)
    {
        Console.WriteLine(j);
    }
})).Start(5);

但我不能这样写:

30    new Thread(new ParameterizedThreadStart(delegate(x) //**parameter type not specified explicitly**
31    {
32        for (int j = 0; j < Convert.ToInt32(x); j++)
33        {
34            Console.WriteLine(j);
35        }
36    })).Start(5);

它会出现多个错误:

  • 类型或命名空间名称&#39; x&#39;找不到(你错过了使用指令或汇编引用吗?) - 第30行
  • 名称&#39; x&#39;在当前上下文中不存在 - 第32行
  • 预期标识符 - 第30行

为什么委托不能推断参数类型?语言设计决定?

2 个答案:

答案 0 :(得分:0)

有多种方法可以定义匿名方法。这是其中之一:

delegate(object x)
{

}

当你使用这个语法时,你必须指定参数type.delegates不能推断参数类型,原因就像你说的语言设计决定。它是关于语法的。当你使用lambda语法时:

(x) =>  {  ... }

编译器在幕后创建委托类型和方法。

注意:也许这个答案不包含足够的解释,但您可以查看this文章来了解差异

答案 1 :(得分:0)

虽然它们很相似,但匿名委托与lambda表达式不同,它们遵循不同的规则。可以隐式推断lambda表达式中的参数类型,但匿名委托要求您明确指定类型。

是的,这是一个语言设计决定。引入Lambda表达式以支持Linq,并且要求显式声明参数类型会使语法不太方便。