为什么不能在lambda表达式中使用ref或out参数呢?
我今天遇到了这个错误,并找到了一种解决方法,但我仍然很好奇为什么这是一个编译时错误。
参数:不能在匿名方法、lambda表达式或查询表达式内使用in ref或out参数“CS1628”
下面是一个简单的例子:
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();
}
发布于 2009-09-02 04:43:33
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表达式中不允许使用这些属性的原因之一。
发布于 2009-09-02 03:26:13
在幕后,匿名方法是通过提升捕获的变量(这就是您的问题主体)并将它们存储为编译器生成的类的字段来实现的。无法将ref
或out
参数存储为字段。Eric Lippert在a blog entry上讨论了这一点。请注意,捕获的变量和lambda参数之间存在差异。你可以像下面这样“形参”,因为它们不是被捕获的变量:
delegate void TestDelegate (out int x);
static void Main(string[] args)
{
TestDelegate testDel = (out int x) => { x = 10; };
int p;
testDel(out p);
Console.WriteLine(p);
}
发布于 2015-11-22 12:19:45
您可以,但必须显式定义所有类型,以便
(a, b, c, ref d) => {...}
是无效的,但是
(int a, int b, int c, ref int d) => {...}
是有效的
https://stackoverflow.com/questions/1365689
复制相似问题