2014-01-10 75 views
1

我可以这样写:为什么不能推断委托参数的类型?

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'(缺少使用指令或装配参考吗?) - 第30行
  • 当前上下文中不存在名称'x' - 第32行
  • 标识符预期 - 行30

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

回答

0

虽然他们是相似的,匿名的代表是不一样的lambda表达式,他们也跟着不同的规则。可以隐式推断lambda表达式中的参数类型,但匿名委托需要您明确指定类型。

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

0

有不同的方法来定义匿名表达方法,这是其中之一:

delegate(object x) 
{ 

} 

当您使用此语法您必须指定参数type.delegates无法推断参数类型,原因是因为你说语言设计decision.And它是关于syntax.Also当您使用lambda语法:

(x) => { ... } 

编译器创建一个委托类型和幕后的方法。

注:也许这个答案没有足够的解释,但你可以看看this文章理解上的差异

相关问题