Solo pensé en compartir esto en caso de que alguien más se haya topado con esto.
Hice algo similar hoy y me llevó un tiempo descubrir por qué esto causaba un problema en el tiempo de ejecución.VB.Net - "Con" y cierres no mezclar
Este código:
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
Lanza una NullReferenceException. Parece que el With está utilizando el cierre como su almacenamiento temporal, y en el "End With", establece la variable del cierre en Nothing.
aquí es que el código en 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
Aviso la "cuestión"
$VB$Closure_ClosureVariable_7A_6.$VB$Local_VB$t_ref$L0 = Nothing
Sólo puedo pedir es realmente; ¿Es este un error o una extraña decisión de diseño que por alguna razón no estoy viendo? Simplemente voy a evitar usar "Con" a partir de ahora.
jaja, acabo de encontrarme con esto: D Ahora entiendo por qué está sucediendo, pero es raro que se compile en absoluto ... –