【发布时间】:2016-09-07 23:37:52
【问题描述】:
我发现,在使用 With 语句访问时,在 Task 中执行的 lambda 表达式中引用成员变量会引发 NullReferenceException。
例如,我希望以下代码在控制台上打印两行。第一个通过obj.SomeString 访问SomeString 成员,而第二个使用With 语句并通过.SomeString 访问成员。我希望这两个选项是等效的,但第二个会引发异常。
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
当我将Console.ReadKey() 语句移到With 语句中时,代码可以工作。
我通过不使用With 语句修复了实际代码,但我仍然不知道我在这里缺少什么概念。为什么我可以访问 lambda 表达式中的 obj 变量的成员,但不能访问 With 表达式的成员?它没有被垃圾收集,因为当抛出异常时我仍然可以在调试器中看到它。该表达式似乎超出了范围(或类似的东西),但为什么编译器不按照我的预期去做,并将其视为与 obj 一样?
【问题讨论】: