C#3.0语言新特性之Lambda表达式
2009-03-12 08:19:19 来源:WEB开发网假设使用using语句导入了System.Query命名空间,并且定义了一个Customer类,具有一个类型为string的属性Name,Select方法可以用于从一个Customer列表中选择名字:
List<Customer> customers = GetCustomerList();
IEnumerable<string> names = customers.Select(c => c.Name);
对扩展方法Select的调用将被处理为一个静态方法调用:
IEnumerable<string> names = Sequence.Select(customers, c => c.Name);
由于没有显式地指定类型参数,将通过类型推断来推导类型参数。首先,customers参数被关联到source参数,T被推断为Customer。然后运用上面提到的拉姆达表达式类型推断过程,C的类型是Customer,表达式c.Name将被关联到selector参数的返回值类型,因此推断S是string。因此,这个调用等价于:
Sequence.Select<Customer, string>(customers, (Customer c) => c.Name);
并且其返回值类型为IEnumerable<string>。
下面的例子演示了Lambda表达式的类型推断是如何允许类型信息在一个范型方法调用的参数之间“流动”的。对于给定的方法:
static Z F<X, Y, Z>(X value, Func<X, Y> f1, Func<Y, Z> f2) { return f2(f1(value)); }
现在我们来写这样一个调用,来看看它的推断过程:
double seconds = F("1:15:30", s => TimeSpan.Parse(s), t => TotalSeconds);
类型推断过程是这样的:首先,参数"1:15:30"被关联到value参数,推断X为string。然后,第一个Lambda表达式的参数s具有推断出来的类型string,表达式TimeSpan.Parse(s)被关联到f1的返回值类型,推断Y是System.TimeSpan。最后,第二个Lambda表达式的参数t具有推断出来的类型System.TimeSpan,并且表达式t.TotalSeconds被关联到f2的返回值类型,推断Z为double。因此这个调用的结果类型是double。
更多精彩
赞助商链接