![](/img/trans.png)
[英]What are C# lambda's compiled into? A stackframe, an instance of an anonymous type, or?
[英]C# What does a lambda that points to a new anonymous type mean?
过去,我在LINQ上使用过lambda,并制作了匿名函数,但以下几行让我感到困惑。
(a,b) => new {a, b.PropertyA, b.PropertyB, b.PropertyC }
这里发生了什么? 似乎匿名方法指向匿名类型。 这作为“ resultSelector”参数传递给Join方法。
让我们从更大的角度来看它。 我们有一个客户表和一个订单表,其中每个客户都有一个整数ID,每个订单都有进行订单的客户的ID。 我们希望所有的客户拥有所有订单的金额:
var results = customers.Join(
orders,
customer => customer.Id,
order => order.CustomerId,
(customer, order) => new {customer, order.Amount});
编译器会将其转换为:
IEnumerable<SomeAnonType<Customer, decimal>> results =
Enumerable.Join<Customer, Order, int, SomeAnonType<Customer, decimal>>(
customers,
orders,
(Customer customer) => { return customer.Id; },
(Order order) => { return order.CustomerId; },
(Customer customer, Order order) => { return new {customer, order.Amount};} );
Join
将枚举所有客户和所有订单,并基于前两个lambda获取他们的ID,并建立ID匹配的(客户,订单)对的集合。 然后它将遍历对的集合,并将它们传递给第三个lambda以产生一系列匿名类型的对象。
现在清楚了吗? 还是您需要更多有关此处发生情况的解释?
练习 :假设Order.CustomerId
为int?
类型int?
,而不是int
。 那应该是一个错误吗? 还是C#应该判断出如果Customer.Id
为int
而Order.CustomerId
为int?
那么用户可能会说“将int
当作int?
”? 假设您进行了Giraffe
, Turtle
键的类型为Giraffe
和Turtle
。 类型推断应该假定您是Animal
意思,还是应该给出一个错误信息,表明不清楚要使用哪种类型? 这是我们在C#3中设计和实现类型推断时所思考的许多微妙问题之一,而当我在C#4中添加泛型方差时,这个问题就变得更加棘手! 看看是否可以解决。
指定的代码表示一个带有两个参数的函数,并且在调用时将创建具有指定属性的新匿名类型。
所以这:
(a,b)
代表参数。
和这个:
new {a, b.PropertyA, b.PropertyB, b.PropertyC }
是要执行的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.