3

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

SharpZipLib 在压缩时会定期调用在启动压缩时传递的委托子。ByRef我不知道在调用委托时如何更新参数。如果我尝试ByRef在 Lamba 表达式的主体中分配变量,则会出现'ByRef' parameter '<parametername>' 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 

谢谢!

4

2 回答 2

16

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

根据MSDN页面上的 Microsoft 回答:

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

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

于 2015-08-14T15:54:45.450 回答
1

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

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

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

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