首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >不能在lambda表达式中使用ref或out参数

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

Stack Overflow用户
提问于 2009-09-02 03:22:44
回答 5查看 104.7K关注 0票数 193

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

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

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

下面是一个简单的例子:

代码语言:javascript
复制
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();
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-09-02 04:43:33

Lambda看起来像是改变了它们捕获的变量的生命周期。例如,下面的lambda表达式会导致参数p1比当前方法框架存在的时间更长,因为它的值可以在方法框架不再位于堆栈中之后访问

代码语言:javascript
复制
Func<int> Example(int p1) {
  return () => p1;
}

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

代码语言:javascript
复制
void Example2(int p1) {
  Action del = () => { p1 = 42; }
  del();
  Console.WriteLine(p1);
}

这两个属性以以下方式生成一组与ref参数冲突的特定效果

  • 引用参数可以具有固定的生存期。考虑将局部变量作为ref参数传递给函数。lambda中的
  • 副作用需要在ref参数本身上可见。无论是在方法中还是在调用方中。

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

票数 132
EN

Stack Overflow用户

发布于 2009-09-02 03:26:13

在幕后,匿名方法是通过提升捕获的变量(这就是您的问题主体)并将它们存储为编译器生成的类的字段来实现的。无法将refout参数存储为字段。Eric Lippert在a blog entry上讨论了这一点。请注意,捕获的变量和lambda参数之间存在差异。你可以像下面这样“形参”,因为它们不是被捕获的变量:

代码语言:javascript
复制
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);
}
票数 88
EN

Stack Overflow用户

发布于 2015-11-22 12:19:45

您可以,但必须显式定义所有类型,以便

代码语言:javascript
复制
(a, b, c, ref d) => {...}

是无效的,但是

代码语言:javascript
复制
(int a, int b, int c, ref int d) => {...}

是有效的

票数 74
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1365689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档