Параметр 'ByRef' <parametername>'нельзя использовать в лямбда-выражении - PullRequest
1 голос
/ 12 февраля 2011

Я использую 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 

Спасибо!

Ответы [ 2 ]

7 голосов
/ 14 августа 2015

Я знаю, что этому вопросу уже 4 года, но я сталкиваюсь с той же проблемой, и я понял ее, поэтому хочу поделиться с вами решением.

Согласно ответу Microsoft на MSDN page:

Необходимо присвоить параметр ByRef локальной переменной и использовать локальную переменную в лямбда-выражении.

Надеюсь, что ответ поможет любому.

0 голосов
/ 25 апреля 2011

Вы не можете объявить делегат Sub с параметрами ByRef ( ref или out в C #), независимо от того, используете ли вы анонимную функцию или нет.

Но вы можете объявить свой тип делегата, а затем использовать его даже с анонимной функцией

Вкл. MSDN В нем упоминаются следующие правила, применимые к области переменных в лямбда-выражениях:

  • Захваченная переменная не будет собираться мусором до тех пор, пока делегат, ссылающийся на нее, не выйдет из области видимости.
  • Переменные, введенные в лямбда-выражение, не видны во внешнем методе.
  • Лямбда-выражение не может напрямую захватить параметр ref [ByRef in VB] или out из метода вложения.
  • Оператор возврата в лямбда-выражении не вызываетвозвращаемый включающий метод.
  • Лямбда-выражение не может содержать оператор goto, оператор break или оператор continue, цель которого находится вне тела или в теле oсодержит анонимную функцию.
...