3

SharpZipLibを使用してファイルを圧縮しています。ライブラリは、別のDLLのプラグインインターフェイスにラップされています。プラグインdllにByRefパラメーターを渡して、圧縮の進行状況を追跡します。

SharpZipLibは、圧縮中に、圧縮の起動時に渡されたデリゲートサブを定期的に呼び出します。ByRefデリゲートが呼び出されたときにパラメーターを更新する方法がわかりません。ByRefランバ式の本体に変数​​を割り当てようとすると、'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パラメーターをローカル変数に割り当て、そのローカル変数をラムダ式で使用する必要があります。

答えが誰かに役立つことを願っています。

于 2015-08-14T15:54:45.450 に答える
1

匿名関数を使用しているかどうかに関係なく、ByRef パラメーター (C# ではrefまたはout ) を使用してSubデリゲートを宣言することはできません。

ただし、デリゲート型を宣言して、匿名関数でも使用できます

MSDNでは、次の規則がラムダ式の変数スコープに適用されることが言及されています

  • キャプチャされた変数は、それを参照するデリゲートがスコープ外になるまでガベージ コレクションされません。
  • ラムダ式内で導入された変数は、外側のメソッドでは表示されません。
  • ラムダ式は、外側のメソッドから ref [VB の ByRef] または out パラメータを直接キャプチャすることはできません。
  • ラムダ式の return ステートメントは、外側のメソッドを返しません。
  • ラムダ式には、ターゲットが本体の外側または含まれる無名関数の本体内にある goto ステートメント、break ステートメント、または continue ステートメントを含めることはできません。
于 2011-04-25T14:36:35.513 に答える