相关疑难解决方法(0)

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

为什么不能在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)

c# lambda

161
推荐指数
4
解决办法
8万
查看次数

匿名方法的范围

匿名方法的一个好处是我可以使用调用上下文中的本地变量.有什么理由说这不适用于输出参数和功能结果吗?

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)

这不像其他案件那样有问题吗?谁保证只要执行匿名方法,引用仍指向活动对象?

delphi scope anonymous-methods delphi-2009

10
推荐指数
2
解决办法
4155
查看次数

lambda表达式如何在内部工作?

在查找这个问题的答案时:" 为什么在匿名方法中不允许使用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工作呢?

c# lambda anonymous-methods

7
推荐指数
2
解决办法
3543
查看次数

使用匿名方法中的ref或out参数调用方法

这个问题与前几天我问的问题有关,我从中得到了一些很好的答案.

我需要以通用方式调用具有不同签名的各种Web方法.我希望能够将Web方法传递给具有委托参数的方法,但我不确定如何处理不同的签名.解决方案是使用lambdas(或匿名方法,因为我现在正在使用C#2).

这很好用,直到我需要我的匿名方法来调用带有out参数的web方法.由于此处说明的原因,您无法执行此操作.

所以我的问题是,除了创建一个没有引用的包装器方法或者从我的匿名方法调用params之外,是否有更简单的方法来实现这一点?

.net c#

5
推荐指数
1
解决办法
4291
查看次数

标签 统计

c# ×3

anonymous-methods ×2

lambda ×2

.net ×1

delphi ×1

delphi-2009 ×1

scope ×1