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 

Единственный «вопрос», который я действительно могу задать, это; это ошибка или странное дизайнерское решение, которое по какой-то причине я не вижу. Я просто собираюсь избегать использования «С» с этого момента.

Ответы на вопрос(1)

Ваш ответ на вопрос