Başka birinin buna rastlaması durumunda bunu paylaşacağımı düşündüm.
Bugün benzer bir şey yaptım ve bunun neden çalışma zamanında bir soruna neden olduğunu anlamaları biraz zaman aldı.VB.Net - "With" ve Kapaklar karıştırılmıyor
Bu kod:
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
bir NullReferenceException atar. With, kapanışını geçici depolama alanı olarak kullanıyor ve “End With” ile kapanış değişkenini Nothing olarak ayarlıyor gibi görünüyor. İşte
RedGate yansıtıcı içinde o kod şudur: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
Sadece "sorusu" Gerçekten sorabilir Bildirimi olduğu; Bu bir hata ya da bazı sebeplerden dolayı göremediğim garip bir tasarım kararı. Şu andan itibaren "With" özelliğini kullanmaktan kaçınacağım.
haha, Ben sadece şunu anladım: D Şimdi neden olduğunu anlıyorum ama tamamen derler ki ... –