• ベストアンサー

Option Strictと構造体とArrayListの関係について(VB2005)

下記はArrayListに構造体の値を格納し、表示させるプログラムです。 -------------------------------- Option Strict Off '構造体 Public Structure hoge   Dim a As String   Dim b As String   Dim c As String End Structure Private Sub test()   Dim aryhoge As New ArrayList   Dim foo As hoge   foo.a = "aa"   foo.b = "bb"   foo.c = "cc"   aryhoge.Add(foo)           MessageBox.Show(aryhoge(0).a)  'A) Option Strict Off だと"aa"と表示される End Sub -------------------------------- このプログラムはOption Strict Offだとメッセージボックスに"aa"と表示されます。 ですがOption Strict Onだと、(A)の箇所にて「遅延バインディングを使用できません」というエラーが発生し、実行ができません。 質問内容は、Option Strict Onで上記のプログラムを動かすには、(A)をどのように修正すればよいか、というものです。 どうぞよろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

Namespace Q3396774 Public Structure hoge   Dim a As String   Dim b As String   Dim c As String End Structure Class Q3396774A '構造体 Shared Sub Main test() End Sub Shared sub test()   Dim aryhoge As New System.Collections.ArrayList   Dim foo As hoge   foo.a = "aa"   foo.b = "bb"   foo.c = "cc"   aryhoge.Add(foo)    'A) Option Strict Off だと"aa"と表示される   'ArrayListに追加された要素は「System.Object」なのでメンバにaはない。   '明示的に「hoge構造体」に変換してあげる   System.Windows.Forms.MessageBox.Show(DirectCast(aryhoge(0),hoge).a)   'ただし個人的にはSystem.Collections.Generic.List(Of hoge)を勧めたい      Dim aryhoge2 As New System.Collections.Generic.List(Of hoge)   Dim foo2 As hoge   foo2.a = "aa"   foo2.b = "bb"   foo2.c = "cc"   aryhoge2.Add(foo2)    'キャストする必要がない   System.Windows.Forms.MessageBox.Show(aryhoge2(0).a)      '本質問とは関係ないしどうでもいいことだけれど,コレクション系のクラスを扱うときには   'http://oshiete1.goo.ne.jp/qa3320160.html 'のような問題が発生することも知っておくといいですね。 End Sub End Class End Namespace

tekan
質問者

お礼

なるほど。。 これがキャストする、ということなのですね。具体例のおかげで、ようやく理解ができました。 Generic.Listは不勉強でまだ手付かずでしたが、こういう機能があるのですね。。 大変参考になりました。早速勉強してみます! リンク先の資料も拝見しました。 少々理解が及ばない点もありますが、折を見てじっくり勉強させていただきます。 ご回答ありがとうございました。

その他の回答 (1)

回答No.1

MessageBox.Show(CType(aryhoge(0), hoge).a)

tekan
質問者

お礼

できました! こういうのをキャストというのですね。。 CType関数やDirectCastの使い方がようやく見えてきました。 ご回答ありがとうございました。

関連するQ&A

専門家に質問してみよう