tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 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 のコードには違和感しかないです…。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。