Lambda表达式在内部是如何工作的?

7
在查找答案时,我遇到了这个问题:“为什么匿名方法中不允许使用out参数?”(链接在此:Why is an out parameter not allowed within an anonymous method?),这让我对lambda表达式和匿名方法的工作原理有些困惑。
在评论中,JaredPar指出:“比如说,假设out参数引用了栈上的一个局部变量。Lambda表达式可以在任意时间点执行,因此可能会在该栈帧已经无效的情况下执行。”。
我指出,如果是其他变量,情况不也是一样的吗……这基本上让我怀疑我对lambda表达式到底了解多少。
我的想法类似于这样:
public void Foo(ComplexObject val, out SomeDelegate outDelegate)
{
  ComplexObject obj = new ComplexObject(val)
  SomeDelegate = delegate(int other) { return (obj.value * other); }  
}

public void Bar()
{
  SomeDelegate MyDel = null;
  Foo(5, out MyDel);
  int finalRes = MyDel(100);
  // Whatever
}

在这种情况下,我不太清楚发生了什么。 obj是堆栈上的引用,在方法返回后将不再有效,因此匿名方法(如果可以)应该能够实际知道这是一个引用类型并复制引用而不是值,如果它确实可以...那么“使用情况”基本相同,为什么ref参数不起作用呢?
2个回答

8

6

Jon Skeet写了一篇深入描述

基本上,编译器将外部方法转换为类,并将所有被匿名方法访问的变量转换为类的字段。 匿名方法成为类的常规实例方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接