在查找答案时,我遇到了这个问题:“为什么匿名方法中不允许使用out参数?”(链接在此:Why is an out parameter not allowed within an anonymous method?),这让我对lambda表达式和匿名方法的工作原理有些困惑。
在评论中,JaredPar指出:“比如说,假设out参数引用了栈上的一个局部变量。Lambda表达式可以在任意时间点执行,因此可能会在该栈帧已经无效的情况下执行。”。
我指出,如果是其他变量,情况不也是一样的吗……这基本上让我怀疑我对lambda表达式到底了解多少。
我的想法类似于这样:
在这种情况下,我不太清楚发生了什么。 obj是堆栈上的引用,在方法返回后将不再有效,因此匿名方法(如果可以)应该能够实际知道这是一个引用类型并复制引用而不是值,如果它确实可以...那么“使用情况”基本相同,为什么ref参数不起作用呢?
在评论中,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参数不起作用呢?