为什么不能在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(); }
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参数的前面飞行
这些属性在某种程度上是不兼容的,并且是lambda表达式中不允许使用它们的原因之一。