Juste pensé que je partagerais ceci dans le cas où quelqu'un d'autre a couru dans ce domaine.
J'ai fait quelque chose de similaire aujourd'hui et il m'a fallu un certain temps pour comprendre pourquoi cela causait un problème à l'exécution.VB.Net - "Avec" et les fermetures ne se mélangent pas
Ce code:
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
Lance une NullReferenceException. Il semble que With utilise la fermeture comme stockage temporaire, et à la fin, elle définit la variable de fermeture sur Nothing.
Voici ce code dans Redgate réflecteur:
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
Notez que le
$VB$Closure_ClosureVariable_7A_6.$VB$Local_VB$t_ref$L0 = Nothing
seulement "question" Je ne peux vraiment poser est; est-ce un bug ou une décision de conception étrange que, pour une raison quelconque, je ne vois pas. Je vais à peu près juste éviter d'utiliser "Avec" à partir de maintenant.
haha, je viens de rencontrer ceci: D Je comprends maintenant pourquoi ça se passe mais c'est bizarre qu'il compile du tout ... –