“通过参考”参数 '<参数名称>'不能在 lambda 表达式中使用

发布于 2024-10-17 06:23:32 字数 919 浏览 4 评论 0原文

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

SharpZipLib 在压缩时将定期调用启动压缩时传递的委托子。我不知道如何在调用委托时更新 ByRef 参数。如果我尝试在lambda表达式主体中分配ByRef变量,我会得到一个'ByRef'参数''不能在 lambda 表达式中使用 错误。

这是我的代码:

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 

谢谢!

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!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

谜兔 2024-10-24 06:23:33

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

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

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

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

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.
最初的梦 2024-10-24 06:23:32

我知道这个问题已经有 4 年历史了,但我也面临着同样的问题,并且我找到了答案,所以我想与您分享解决方案。

根据 Microsoft 在 MSDN 上的回答页:

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

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

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文