为什么不能在lambda表达式中使用ref或out参数?
我今天遇到了错误并找到了解决方法,但我仍然很好奇为什么这是编译时错误.
CS1628:不能在匿名方法,lambda表达式或查询表达式中的ref或out参数'parameter'中使用
这是一个简单的例子:
private void Foo()
{
int value;
Bar(out value);
}
private void Bar(out int value)
{
value = 3;
int[] array = { 1, 2, 3, 4, 5 };
int newValue = array.Where(a => a == value).First();
}
Run Code Online (Sandbox Code Playgroud) 匿名方法的一个好处是我可以使用调用上下文中的本地变量.有什么理由说这不适用于输出参数和功能结果吗?
function ReturnTwoStrings (out Str1 : String) : String;
begin
ExecuteProcedure (procedure
begin
Str1 := 'First String';
Result := 'Second String';
end);
end;
Run Code Online (Sandbox Code Playgroud)
当然是非常人为的例子,但我遇到了一些有用的情况.
当我尝试编译它时,编译器抱怨他"无法捕获符号".此外,当我尝试这样做时,我收到了一个内部错误.
编辑我刚刚意识到它适用于普通参数
... (List : TList)
Run Code Online (Sandbox Code Playgroud)
这不像其他案件那样有问题吗?谁保证只要执行匿名方法,引用仍指向活动对象?
在查找这个问题的答案时:" 为什么在匿名方法中不允许使用out参数? "我对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
}
Run Code Online (Sandbox Code Playgroud)
在那种情况下,我真的不知道发生了什么.obj是堆栈上的引用,它在方法返回时不再有效,因此匿名方法应该能够(如果可行)实际知道它是引用类型并复制引用而不是值,如果它...如果"用例"或多或少相同,为什么不参考params工作呢?