class ShowAllUsersMethodCall { static void Main() { var query = SampleData.AllUsers.Select(user => user); //query System.Linq.Enumerable.WhereSelectListIterator foreach (var user in query)//先是foreach 之后是query //后面是in 调用user => user 返回in 调用varchar //调用一次in 就调用 user => user , 最后一次是退出循环 //var user的值{User: Tim Trotter (Tester)} 赋值完就WriteLine //{User: Tara Tutu (Tester)} //{User: Deborah Denton (Developer)} //{User: Darren Dahlia (Developer)} //{User: Mary Malcop (Manager)} //{User: Colin Carton (Customer)} { Console.WriteLine(user);//调用重写的ToString方法 } } } public class User { public string Name { get; set; } public UserType UserType { get; set; } public User (string name, UserType userType) { Name = name; UserType = userType; } public override string ToString() { return string.Format("User: {0} ({1})", Name, UserType); } } public static IEnumerable<User> AllUsers { get { return users; } } public static class Users { public static readonly User TesterTim = new User("Tim Trotter", UserType.Tester); public static readonly User TesterTara = new User("Tara Tutu", UserType.Tester); public static readonly User DeveloperDeborah = new User("Deborah Denton", UserType.Developer); public static readonly User DeveloperDarren = new User("Darren Dahlia", UserType.Developer); public static readonly User ManagerMary = new User("Mary Malcop", UserType.Manager); public static readonly User CustomerColin = new User("Colin Carton", UserType.Customer); } public enum UserType : byte { Customer, Developer, Tester, Manager, }
编译器转译是查询表达式基础的转译
编译器把查询表达式转译为普通的C#代码,这是支持C#3查询表达式的基础。
它是以一种机械的方式来进行转换的,不会去理解代码、应用类型引用、检查
方法调用的有效性或执行编译器要执行的任何正常工作。这些都在转换完成之后
来执行。
c#3编译器进一步正确地编译查询表达式之前,就把它转译为了这样的代码。
特别地,它不会假定应该使用Enumerable.Select,还是List<T>应该包含
一个Select方法调用。它只是对代码进行转译,并让下一个编译阶段来处理查找
适当方法的工作---不管这个方法是直接包含的成员,还是扩展方法。参数是一个
适当的委托类型或者一个和类型T对应的Expression<T>。
Lambda表达式能被转换为委托实例和表达式树。
输出
User: Tim Trotter (Tester)
User: Tara Tutu (Tester)
User: Deborah Denton (Developer)
User: Darren Dahlia (Developer)
User: Mary Malcop (Manager)
User: Colin Carton (Customer)