VB2008 FW3.5
下記ソースで
[4][5]ともに
「インデックス (0 ベース) は 0 以上で、引数リストのサイズよりも小さくなければなりません。」
というエラーが出ます。
Dim sHex As String = String.Empty
Dim iArg(7) As Integer
Dim iCnt As Integer
For iCnt = 0 To 7
iArg(iCnt) = iCnt
Next iCnt
sHex = String.Format("{0:X1}", iArg(0)) '' [1]-OK
sHex = String.Format("{0:X1}{1:X1}", iArg(0), iArg(1)) '' [2]-OK
sHex = String.Format("{0:X1}{1:X1}{2:X1}", iArg(0), iArg(1), iArg(2)) '' [3]-OK
sHex = String.Format("{0:X1}{1:X1}{2:X1}{3:X1}", iArg) '' [4]-NG
sHex = String.Format("{0:X1}{1:X1}{2:X1}", iArg) '' [5]-NG
VB2005の時は問題なく動作したと思ったのですが、
現在環境がないため試すことができません。
何が間違っているでしょうか。
お分かりの方、ぜひご教示ください。
補足
文字配列の場合だとエラーが出ません。
しかし、16進の文字列がほしいので、期待する文字を得ることはできません。
実際の数字配列の値は最大15までしか使用しません。
VB2005 でも例外になるでしょう。
String.Format には引数のバリエーションが多数存在しますが、2 つの引数を取るのは 2 種類あり、それぞれ第二引数の型は Object と Object() になっています。
Object を渡した場合、その Object 自体がフォーマットされます。
Object() を渡した場合、それぞれの要素が {0} から順に置き換えられていきます。
さて、以下に配列の変換についてのルールが記述されています。
http://msdn.microsoft.com/ja-jp/library/tbatye4h.aspx
これを見れば、いったいどちらが呼ばれているのか分かるかと思います。何故 String() なら問題ないのかも。
いくつあるかわからない配列から文字列を作りたいなら
For Each aa As Integer In iArg
sHex += String.Format("{0:X1}", aa)
Next
とかでもいいのでは?