- ベストアンサー
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)をどのように修正すればよいか、というものです。 どうぞよろしくお願い致します。
- みんなの回答 (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
その他の回答 (1)
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
MessageBox.Show(CType(aryhoge(0), hoge).a)
お礼
できました! こういうのをキャストというのですね。。 CType関数やDirectCastの使い方がようやく見えてきました。 ご回答ありがとうございました。
お礼
なるほど。。 これがキャストする、ということなのですね。具体例のおかげで、ようやく理解ができました。 Generic.Listは不勉強でまだ手付かずでしたが、こういう機能があるのですね。。 大変参考になりました。早速勉強してみます! リンク先の資料も拝見しました。 少々理解が及ばない点もありますが、折を見てじっくり勉強させていただきます。 ご回答ありがとうございました。