【问题标题】:'ByRef' parameter '<parametername>' cannot be used in a lambda expression'ByRef' 参数 '<parametername>' 不能在 lambda 表达式中使用
【发布时间】:2011-02-12 16:41:45
【问题描述】:

我正在使用 SharpZipLib 压缩文件。该库被包装在一个插件接口中,在一个单独的 DLL 中。我向插件 dll 传递了一个 ByRef 参数来跟踪压缩进度。

SharpZipLib 在压缩时会定期调用在启动压缩时传递的委托子。我不知道在调用委托时如何更新ByRef 参数。如果我尝试在 Lamba 表达式的主体中分配 ByRef 变量,我会收到 'ByRef' parameter '&lt;parametername&gt;' cannot be used in a lambda expression 错误。

这是我的代码:

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 

谢谢!

【问题讨论】:

    标签: vb.net lambda pass-by-reference byref


    【解决方案1】:

    我知道这个问题已有 4 年历史了,但我只是面临同样的问题,我想通了,所以我想与你分享解决方案。

    根据MSDN 页面上的 Microsoft 回答:

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

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

    【讨论】:

    • 我觉得编译器应该在后台执行此操作,但此解决方案就是答案。谢谢!
    【解决方案2】:

    您不能使用 ByRef 参数(C# 中的 refout)声明 Sub 委托,无论您是否使用匿名功能与否。

    但是您可以声明您的委托类型,然后将其与您的匿名函数一起使用

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

    • 在引用它的委托超出范围之前,不会对捕获的变量进行垃圾回收。
    • 在 lambda 表达式中引入的变量在外部方法中不可见。
    • lambda 表达式不能直接从封闭方法中捕获 ref [ByRef in VB] 或 out 参数。
    • lambda 表达式中的 return 语句不会导致封闭方法返回。
    • lambda 表达式不能包含 goto 语句、break 语句或 continue 语句,其目标位于所包含匿名函数的主体之外或主体中。

    【讨论】:

      猜你喜欢
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多