VB.Net - «С» и замыкания не смешиваются
Просто подумал, что поделюсь этим на случай, если кто-нибудь еще столкнется с этим.
Сегодня я сделал нечто подобное, и мне потребовалось некоторое время, чтобы понять, почему это вызывает проблемы во время выполнения.
Этот код:
Public Class foo
Public bar As String = "blah"
End Class
Public Sub DoInline()
Dim o As New foo
Dim f As Func(Of String)
With o
f = Function() .bar
End With
Try
Console.WriteLine(f.DynamicInvoke())
Catch ex As Reflection.TargetInvocationException
Console.WriteLine(ex.InnerException.ToString)
End Try
End Sub
Выдает исключение NullReferenceException. Похоже, что With использует замыкание в качестве своего временного хранилища, а в «End With» оно устанавливает переменную замыкания в Nothing.
Вот этот код в RedGate Reflector:
Public Shared Sub DoInline()
Dim o As New foo
Dim $VB$Closure_ClosureVariable_7A_6 As New _Closure$__1
$VB$Closure_ClosureVariable_7A_6.$VB$Local_VB$t_ref$L0 = o
Dim f As Func(Of String) = New Func(Of String)(AddressOf $VB$Closure_ClosureVariable_7A_6._Lambda$__1)
$VB$Closure_ClosureVariable_7A_6.$VB$Local_VB$t_ref$L0 = Nothing
Try
Console.WriteLine(RuntimeHelpers.GetObjectValue(f.DynamicInvoke(New Object(0 - 1) {})))
Catch exception1 As TargetInvocationException
ProjectData.SetProjectError(exception1)
Console.WriteLine(exception1.InnerException.ToString)
ProjectData.ClearProjectError
End Try
End Sub
Обратите внимание на
$VB$Closure_ClosureVariable_7A_6.$VB$Local_VB$t_ref$L0 = Nothing
Единственный «вопрос», который я действительно могу задать, это; это ошибка или странное дизайнерское решение, которое по какой-то причине я не вижу. Я просто собираюсь избегать использования «С» с этого момента.