[VB.NET] 配列の下限の設定

2010年5月4日

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






カテゴリー: Program, VB.NET

Follow comments via the RSS Feed | Leave a comment | Trackback URL

コメントを投稿する

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


«   »
 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org