With
ステートメントを使用してアクセスするときに、タスクで実行されるラムダ式のメンバ変数を参照するとNullReferenceException
がスローされることがわかりました。Withステートメントの式がタスクのラムダ式でNothingになる
たとえば、次のコードでコンソールに2行を出力するとします。最初のメンバーはobj.SomeString
でSomeString
メンバーにアクセスし、2番目のメンバーはWith
ステートメントを使用し、.SomeString
でメンバーにアクセスします。私は両方のオプションが同等であることを期待しましたが、2番目のオプションは例外をスローします。
Class Foo
Public SomeString As String
End Class
Module Module1
Sub Main()
Dim obj As New Foo With {.SomeString = "Hello World"}
With obj
Task.Factory.StartNew(
Sub()
Console.WriteLine("1:" + obj.SomeString) ' works
Console.WriteLine("2:" + .SomeString) ' NullReferenceException here
End Sub)
End With
Console.ReadKey()
End Sub
End Module
は私が
With
文に
Console.ReadKey()
文を移動すると、コードが動作します。
With
ステートメントを使用せずに実際のコードを修正しましたが、私はここで何が欠けているのか分かりません。ラムダ式のobj
変数のメンバーにアクセスできますが、With
式のメンバーにアクセスできないのはなぜですか?例外がスローされたときに私はデバッガでそれを見ることができるので、ガベージコレクションは行われていません。式はスコープ(またはそのようなもの)から外れているように見えますが、コンパイラは私が期待したとおりにして、それをobj
と同じように扱わないのはなぜですか?