タイトル : Re^7: 組み合わせ合計検索 つづき 投稿日 : 2023/08/17(Thu) 11:49 投稿者 : 魔界の仮面弁士
> error BC30451: 'i' は宣言されていません。アクセスできない保護レベルになっています。 > 何か設定などに違いあるのでしょううか? プロジェクトのプロパティで、[コンパイル]タブを開いたときに、 コンパイル オプションで「Option Infer」を On から Off に変更していませんか? そのような指定がされていないのであれば、No.12102 の元コードを 一字一句違わず貼りつけただけで動くはずです。 改めて、For ループのカウンター変数についておさらいしてみましょう。 VB.NET 2002 および、VB6 や VBA においては Dim i As Integer For i = 0 To 10 Next のように、ループ変数は For 文よりも外側で宣言せねばなりませんでした。 それが VB.NET 2003 では、 For i As Integer = 0 To 10 Next と書くことで、C# などと同様に「For ループの定義と同時に変数宣言」できるようになりました。 また、この書き方で書かれた変数は For の外では使用できない局所変数となるため、 変数のスコープを狭めてくれる効果も得られます。 さらに VB2008 においては、「型推論」の仕組みが追加されたことで、上記の記述を For i = 0 To 10 Next と、As 句を省略できるようになりました。(VB.NET 2003 と違い、直前に Dim も不要) この場合、代入式の右辺にある「0」が Integr 値であることから、 コンパイル時には、変数 i が As Integer として扱われるようになっています。 For i = 0L と書けば As Long 相当 ただし 2008 以降であっても、「Option Infer Off」モードでコンパイルされた場合には、 型推論が使われなくなるため、As 句無しのままでは変数の「宣言」とみなされません。この場合は > error BC30451: 'i' は宣言されていません。アクセスできない保護レベルになっています。 というエラーが生じることになってしまいます。 …しかし、仮に Option Infer Off などであったとしても、 For i = index To maxIndex Dim i As Integer = 0 Next や For i = index To maxIndex Next Dim i As Integer = 0 といったコードは文法的に許可されないはずです。 そのため、やはり No.12131 のコードには違和感しかないです…。 |