String.Format(format,object())について


わたしき  2008-08-28 01:15:48  No: 145134

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までしか使用しません。


Hongliang  2008-08-28 01:56:00  No: 145135

VB2005 でも例外になるでしょう。
String.Format には引数のバリエーションが多数存在しますが、2 つの引数を取るのは 2 種類あり、それぞれ第二引数の型は Object と Object() になっています。
Object を渡した場合、その Object 自体がフォーマットされます。
Object() を渡した場合、それぞれの要素が {0} から順に置き換えられていきます。

さて、以下に配列の変換についてのルールが記述されています。
http://msdn.microsoft.com/ja-jp/library/tbatye4h.aspx
これを見れば、いったいどちらが呼ばれているのか分かるかと思います。何故 String() なら問題ないのかも。


ご〜〜  2008-09-02 01:09:38  No: 145136

いくつあるかわからない配列から文字列を作りたいなら

        For Each aa As Integer In iArg
            sHex += String.Format("{0:X1}", aa)
        Next

とかでもいいのでは?


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加