VB6では可能だった配列の下限指定がVB.NETでは出来ないという評判だったのですが、実のところ可能です。 正直余計な事を…って感じですが(汗
たとえば以下。
Private Sub Button1_Click(...) Handles Button1.Click Dim a As System.Array = _ System.Array.CreateInstance(GetType(Integer), New Integer() {5}, New Integer() {1}) Dim value As Integer For index As Integer = LBound(a) To UBound(a) value = index * 100 a(index) = value Next For index As Integer = 1 To 5 value = a(index) Debug.Print(value.ToString) Next End Sub
それで、こいつをアクセス使用とした場合、Option Strict Off 下では、上記のように書けますが、 Option Strict On下では「遅延バインディングできません」と怒られます。そこで以下のように訂正する必要があります。
a(index) = value ↓ a.SetValue(value, index) value = a(index) ↓ value = CInt(a.GetValue(index))
SetValueやGetValueを使わなくてはなりません。面倒ですね。
ではいっそのことInteger()に代入できないのかしら?と思ってもその試みは失敗します。
Private Sub Button1_Click(...) Handles Button1.Click Dim a As System.Array = _ System.Array.CreateInstance(GetType(Integer), New Integer() {5}, New Integer() {1}) Dim b As Integer() Debug.Print(TypeName(a)) ' Integer() を出力 b = CType(a, Integer()) ' System.InvalidCastException' の初回例外が WindowsApplication1.exe で発生しました。 ' 型 'System.Int32[*]' のオブジェクトを型 'System.Int32[]' にキャストできません。 End Sub
例外が出ます。TypeName()では同じ型であるかのように表示されるが、内部的に型は違いますよと。
# Int32[*]の[*]って、添字下限が0じゃないですよ、という意味なんですかね…
キャストで例外が出てしまうのは、Array.CreateInstance が悪いのではなく、配列下限が原因です。よって、Array.CreateInstanceを使っても下限が 0 であれば問題ありません。