我可以这样写:
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);
它会出现多个错误:
为什么委托不能推断参数类型?语言设计决定?
答案 0 :(得分:0)
有多种方法可以定义匿名方法。这是其中之一:
delegate(object x)
{
}
当你使用这个语法时,你必须指定参数type.delegates不能推断参数类型,原因就像你说的语言设计决定。它是关于语法的。当你使用lambda语法时:
(x) => { ... }
编译器在幕后创建委托类型和方法。
注意:也许这个答案不包含足够的解释,但您可以查看this文章来了解差异
答案 1 :(得分:0)
虽然它们很相似,但匿名委托与lambda表达式不同,它们遵循不同的规则。可以隐式推断lambda表达式中的参数类型,但匿名委托要求您明确指定类型。
是的,这是一个语言设计决定。引入Lambda表达式以支持Linq,并且要求显式声明参数类型会使语法不太方便。