C#3.0语言新特性之Lambda表达式
2009-03-12 08:19:19 来源:WEB开发网核心提示: 来看如下代码,如果这样赋值会怎么样?F<double, int> f3 = x => x + 1;我们运行上面的代码,C#3.0语言新特性之Lambda表达式(5),编译器会报如下两条错误:(1)无法将类型“double”隐式转换为“i
来看如下代码,如果这样赋值会怎么样?
F<double, int> f3 = x => x + 1;
我们运行上面的代码,编译器会报如下两条错误:
(1)无法将类型“double”隐式转换为“int”。存在一个显式转换(是否缺少强制转换?)。
(2)无法将Lambda表达式转换为委托类型“F<double,int>”,原因是块中的某些返回类型不能隐式转换为委托返回类型。
其实产生一个编译期错误原因是,x给定的类型是double,x + 1的结果(类型为double)不能被隐式地转换为int。
20.5.3 类型推断
当在没有指定类型参数的情况下调用一个范型方法时,一个类型推断过程会去尝试为该调用推断类型参数。被作为参数传递给范型方法的Lambda表达式也会参与这个类型推断过程。
最先发生的类型推断独立于所有参数。在这个初始阶段,不会从作为参数的Lambda表达式推断出任何东西。然而,在初始阶段之后,将通过一个迭代过程从Lambda表达式进行推断。特别地,当下列条件之一为真时将会完成推断:
l 参数是一个Lambda表达式,以后简称为L,从其中未得到任何推断;
l 相应参数的类型,以后简称为P,是一个委托类型,其返回值类型包括了一个或多个方法类型参数;
l P和L具有相同数量的参数,P中每个参数的修饰符与L中相应的参数一致,或者如果L具有隐式类型的参数列表时,没有参数修饰符;
l P的参数类型不包含方法类型参数,或仅包含于已经推断出来的类型参数相兼容的一组类型参数;
l 如果L具有显式类型的参数列表,当推断出来的类型被P中的方法类型参数取代了时,P中的每个参数应该具有和L中相应参数一致的类型。
更多精彩
赞助商链接