'ByRef' parameter '<parametername>' cannot be used in a lambda expression

我是研究僧i 提交于 2019-12-18 08:58:50

问题


I'm using SharpZipLib to compress files. The library is wrapped in a plugin interface, in a separate DLL. I pass the plugin dll a ByRef parameter to keep track of the compression progress.

SharpZipLib, while compressing, will periodically call a delegate sub passed when launching the compression. I can't figure out how to update the ByRef parameter when the delegate is called. If I try to assign the ByRef variable in the body of a lamba expression, I get a 'ByRef' parameter '<parametername>' cannot be used in a lambda expression error.

Here's my code:

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 

Thanks!


回答1:


I know that question is 4 years old but i'm just facing the same problem and i figured it out so i want to share the solution with you.

According to the Microsoft answer on the MSDN page:

You have to assign the ByRef parameter to a local variable, and use the local variable in the lambda expression.

Hope the answer help anyone.




回答2:


You can't declare the Sub delegate with ByRef parameters (ref or out in C#), no matter if you using an anonymous function or not.

But you can declare your delegate type and then use it even with your anonymous function

On MSDN it mentions the following rules apply to variable scope in lambda expressions:

  • A variable that is captured will not be garbage-collected until the delegate that references it goes out of scope.
  • Variables introduced within a lambda expression are not visible in the outer method.
  • A lambda expression cannot directly capture a ref [ByRef in VB] or out parameter from an enclosing method.
  • A return statement in a lambda expression does not cause the enclosing method to return.
  • A lambda expression cannot contain a goto statement, break statement, or continue statement whose target is outside the body or in the body of a contained anonymous function.


来源:https://stackoverflow.com/questions/4979208/byref-parameter-parametername-cannot-be-used-in-a-lambda-expression

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!