Ich dachte nur, ich würde dies teilen, falls irgendjemand anderes in diese Sache geraten ist.
Ich habe heute etwas ähnliches gemacht und es hat eine Weile gedauert, bis ich herausgefunden habe, warum dies zur Laufzeit ein Problem verursacht hat.VB.Net - "With" und Closures vermischen sich nicht
Dieser 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
wirft eine Nullreferenceexception. Es sieht so aus, als ob With den Closure als temporären Speicher verwendet und bei "End With" die Closure-Variable auf Nothing setzt.
ist hier, dass Code in RedGate Reflektor:
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
Hinweis der
$VB$Closure_ClosureVariable_7A_6.$VB$Local_VB$t_ref$L0 = Nothing
Nur "Frage" ich wirklich fragen kann; Ist das ein Fehler oder eine seltsame Designentscheidung, die ich aus irgendeinem Grund nicht sehe? Ich werde von jetzt an einfach vermeiden, "With" zu verwenden.
haha, ich bin gerade auf folgendes gestoßen: D Ich verstehe jetzt, warum es passiert, aber es ist komisch, dass es überhaupt kompiliert ... –