Ich habe überprüft, dass die Position der Variablendeklarationen in VB.NET keine Rolle spielt, außer für den Bereich (für diese Frage ) und ich dachte, ich überprüfe besser, was passiert, wenn sie in eine Schließung "gehoben" werden. Ich habe die Spezifikation nicht gelesen, aber ich kann diese Ergebnisse nicht erklären:
%Vor%Die obigen Ausgaben:
%Vor% inner4
wird jedes Mal zurückgesetzt, wenn es sinnvoll ist, genauso wie alle oder keine der anderen innerX
, aber warum nur inner2
?!
Von MSDN (Hervorhebung von mir):
[...] was der Compiler im Grunde tut, wenn er in einen neuen Bereich mit einer angehobenen Variablen eintritt, prüft der Compiler, ob bereits eine Instanz der Schließung existiert; Wenn dies der Fall ist, erstellt der Compiler eine neue Instanz der Schließung und setzt den Wert der Variablen aus der vorherigen Schließung zurück.
Beachten Sie, dass der Compiler nur die obige Überprüfung durchführt , wenn er eine Schleife oder ein GoTo in der Funktion erkennt, in der die Schließung generiert wird .
(Dies ist mehr ein Kommentar, aber benötigt zu viel Code, um es als eins zu halten.)
Reflector zeigt was passiert:
%Vor% (Dies basiert auf meinem Code, der ein Try
außerhalb des For
enthält.)
Sie können hier die For
-Schleife sehen (gesehen als Do
-Schleife mit der $VB$Local_i
vorher gesetzt) und die innere Do
erzeugen Schließungen, bei denen die vorherige Instanz der Schließung übergeben wurde, aber die Try
bekommt diese Behandlung nicht.
Weiß immer noch nicht warum ? Sieht für mich wie ein Käfer aus. Wenn ich an einem Tag keine vernünftige "Entschuldigung" (:-)) bekomme, setze ich sie auf Connect. (Kann jemand bestätigen, dass .NET 4.5 VB11 das gleiche tut?)