您的位置:首页 > 编程语言 > C#

C#中的委托,匿名方法和Lambda表达式(转载)

2010-10-12 20:46 387 查看
本文转载自/article/4950361.html

简介

  在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆。我想下面的代码能证实这点。下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个First不仅被编译,并都获得正确答案,且他们的结果一样。如果你对此感到困惑,那么请继续看这篇文章。

代码 1 List<string> list = new List<string>();
2 IQueryable<string> query = list.AsQueryable();
3 list.Add("one");
4 list.Add("two");
5 list.Add("three");
6
7 string foo = list.First(x => x.EndsWith("o"));
8 string bar = query.First(x => x.EndsWith("o"));
9 // foo and bar are now both 'two' as expected
10 foo = list.First(x => { return x.EndsWith("e"); }); //no error
11 bar = query.First(x => { return x.EndsWith("e"); }); //error
12 bar = query.First((Func<string,bool>)(x => { return x.EndsWith("e"); })); //no error

倒数第二行在编译时失败。这是因为IQueryable.First期望得到一个表达式作为参数,然而List<T>.First期望得到一个委托。你可以按照最后一行强制转换Lambda到一个委托(使用First的方法重载)。   这里很难结束讨论,但是我觉得必须停止。Lambda大体上分为两类:一类创建匿名方法和委托;另一类创建表达式。表达式自成一体,并不是.NET开发者的必备知识(无疑在LINQ中已有实现)。

备注:

  此文为CodeProject上的同名文章<C# Delegates,Anonymous Methods, and Lambda Expressions>,个人觉得非常好,所以就翻一下给不想看英文的同学。由于能力有限,翻译的不好,

望大家多多包涵。

[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐