元ネタ:VBのスコープわがんね
■深く考えたら負けw→Visual Basic 言語の概念 スコープのレベル
(上記の抜粋)
メモ 要素のスコープがブロック内に制限されている場合でも、要素の有効期間がプロシージャ全体であることは変わりません。プロシージャの実行中に同じブロックが複数回使用される場合、ブロック変数は前の値を保持します。このような場合は、予想外の結果が生じる可能性があるため、変数を毎回初期化することをお勧めします。
(抜粋終了)
つまり、VBの場合は、ブロックがどうのこうのなんてのは関係なくて、あくまでプロシージャ内で宣言されたものはそのプロシージャ内で内容を保持、でも使えるのはブロック内のみ。という面妖な仕様ですw
C#などのようにあいまいさ回避とかじゃなくて、仕様ですw
続き→なぜ、VBのローカル変数はこんなに面妖なのか(いわゆるマッチポンプw)
【おまけ】
Sub Main()
Dim i As Integer
Dim j As Integer'1回目の宣言
i = 0
If i = 0 Then
Dim j As Integer 'この行でコンパイルエラー:2回目の宣言→変数'j' は、それを囲むブロック内の変数を非表示にします。
j = 2
End If
End Sub
Dim i As Integer
Dim j As Integer
i = 0
If i = 0 Then
'Dim j As Integer '変数'j' は、それを囲むブロック内の変数を非表示にします。
Dim k As Integer '変数'j' は、それを囲むブロック内の変数を非表示にします。
k = 2
End If
Console.WriteLine(k)' この行でコンパイルエラー:名前 'k' は宣言されていません。
static void Main(string[] args)
{
int i,j;//一回目の宣言
i = 0;
j = 1;
if (i == 0)
{
int j;// この行でコンパイルエラー:2回目の宣言→ローカルの変数 'j' をこのスコープで宣言することはできません。
//これは、'親またはカレント' スコープで別の意味を持つ 'j' の意味が変更されるのを避けるためです。
j = 2;
}
}