小编典典

不能在 lambda 表达式中使用 ref 或 out 参数

all

为什么不能在 lambda 表达式中使用 ref 或 out 参数?

我今天遇到了这个错误并找到了解决方法,但我仍然很好奇为什么这是一个编译时错误。

CS1628:不能在匿名方法、lambda 表达式或查询表达式中使用 in ref 或 out
参数“参数”

这是一个简单的例子:

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();
}

阅读 134

收藏
2022-07-07

共1个答案

小编典典

Lambda 看起来会改变它们捕获的变量的生命周期。例如,下面的 lambda 表达式导致参数 p1比当前方法帧的 寿命
更长,因为它的值可以在方法帧不再在堆栈上之后访问

Func<int> Example(int p1) {
  return () => p1;
}

捕获变量的另一个属性是变量的更改在 lambda 表达式之外也是可见的。例如以下打印 42

void Example2(int p1) {
  Action del = () => { p1 = 42; }
  del();
  Console.WriteLine(p1);
}

这两个属性会产生一组特定的效果,这些效果通过以下方式在 ref 参数面前飞行

  • ref 参数可能具有固定的生命周期。考虑将局部变量作为 ref 参数传递给函数。
  • lambda 中的副作用需要在 ref 参数本身上可见。在方法中和调用者中。

这些是有些不兼容的属性,也是 lambda 表达式中不允许使用它们的原因之一。

2022-07-07