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 であれば問題ありません。