为什么匿名方法中不允许使用out参数?

Chr*_*nce 14 c# anonymous-methods out-parameters ref-parameters

这不是使用匿名方法的ref或out参数调用方法的欺骗

我想知道为什么在匿名方法中不允许输出参数.不允许ref参数对我来说更有意义,但是out参数不是那么多.

你对此有何看法?

Jar*_*Par 29

在某些方面,这是一个骗局. Out参数是ref参数.C#语言使用的值只有一个额外的属性.不允许它们的原因与ref参数完全相同.

这里的问题源于在匿名方法中使用匿名方法之外声明的值的效果.这样做会捕获lambda中的值,并且必然会将其生命周期延长到超出当前函数的寿命.这与out具有固定寿命的参数不兼容.

例如,假设out参数引用堆栈上的局部变量.lambda可以在将来的任意点执行,因此可以在该堆栈帧不再有效时执行.会是什么out参数的意思呢?

  • 一个小的挑选:ref参数的"outness"不是由modopt表示的,它由一个属性表示.使用modopt可能是一个更好的主意,因为那时你可以有两个相同签名的方法,它们只在out/ref-ness中有所不同.但是在评估签名相等性时不考虑属性. (3认同)
  • @Jorge,如果你在lambda表达式中使用局部变量,它将永远不会位于堆栈上.闭合捕获机制实际上将完全从方法中移除它(用反射器检查输出).参数有点不同,因为它们只是在方法的开头被复制到lambda中. (2认同)

Nol*_*rin 6

这基本上与匿名委托/ lambda表达式的参数是捕获变量这一事实有关,并且捕获ref/ out变量在C#/ CLR中没有任何意义,因为它在内部需要ref/ out fields.另外,请注意我将这两个关键字配对,因为它们实际上是相同的.

如果你想要一个完整的解释,Eric Lippert在他的博客上详细讨论了这个设计点.(特别参见底部附近的段落.)