首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >'ByRef‘参数'<parametername>’不能在lambda表达式中使用

'ByRef‘参数'<parametername>’不能在lambda表达式中使用
EN

Stack Overflow用户
提问于 2011-02-12 16:41:45
回答 2查看 4.9K关注 0票数 4

我正在使用SharpZipLib压缩文件。该库封装在一个插件接口中,在一个单独的DLL中。我传递插件dll一个ByRef参数来跟踪压缩过程。

SharpZipLib在压缩时,会定期调用启动压缩时传递的委托子。当调用委托时,我不知道如何更新ByRef参数。如果我试图在lamba表达式的主体中赋值ByRef变量,就会得到一个'ByRef' parameter '<parametername>' cannot be used in a lambda expression错误。

这是我的密码:

代码语言:javascript
运行
复制
Using InputFile As New IO.FileStream(SourceFile, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read)
    Using OutputFile As New IO.FileStream(DestFile, IO.FileMode.Create)
        Using GZipStream As New GZipOutputStream(OutputFile)
            Dim Buffer(524228) As Byte
            Dim Handler As New ProgressHandler(Sub(Sender As Object, EventArgs As ProgressEventArgs) Progress += EventArgs.Processed)
            StreamUtils.Copy(InputFile, GZipStream, Buffer, Handler, New TimeSpan(10000000), Nothing, "")
        End Using
    End Using
End Using 

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2015-08-14 15:54:45

我知道这个问题已经4岁了,但我也面临着同样的问题,所以我想和大家分享这个问题的解决方案。

根据微软在MSDN页面上的答案:

必须将ByRef参数分配给局部变量,并在lambda表达式中使用局部变量。

希望这个答案对任何人都有帮助。

票数 17
EN

Stack Overflow用户

发布于 2011-04-25 14:36:35

无论是否使用匿名函数,都不能使用ByRef参数(C#中的ref或out )来声明Sub委托。

但是您可以声明您的委托类型,然后使用它,甚至可以使用您的匿名函数。

MSDN上,它提到了适用于lambda表达式中变量范围的以下规则:

  • 被捕获的变量将不会被垃圾收集,直到引用它的委托超出作用域为止。
  • 在lambda表达式中引入的变量在外部方法中不可见。
  • 一个lambda表达式不能在VB中直接捕获ref ByRef,也不能从一个封闭方法中捕获out参数。
  • lambda表达式中的返回语句不会导致封装方法返回。
  • lambda表达式不能包含目标位于主体之外或包含的匿名函数正文中的goto语句、body语句或whose语句。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4979208

复制
相关文章

相似问题

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