繁体   English   中英

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

[英]Why cannot infer types of delegate parameters?

我可以这样写:

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);

它给出了多个错误:

  • 找不到类型或名称空间名称“ x”(是否缺少using指令或程序集引用?)-第30行
  • 名称“ x”在当前上下文中不存在-第32行
  • 预期的标识符-第30行

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

定义匿名方法的方法有很多种,这是其中一种:

delegate(object x)
{

}

当您使用这种语法时,您必须指定参数类型.delegates无法推断参数类型,其原因与您所说的语言设计决定有关,并且与语法有关。当您使用lambda语法时:

(x) =>  {  ... }

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

注意:也许这个答案没有足够的解释,但是您可以看一下这篇文章来了解其中的区别

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM