DOBON.NET DOBON.NETプログラミング掲示板過去ログ

string型配列へのキャストについて

環境/言語:[WinXp SP2 + VB2005 Express +.NET2.0]
分類:[.NET]

お世話になっております。

System.Arrayからstring()へのキャストがわからないので教えてください。

BASP21.DLLを使用して、メールの受信プログラムを作っています。
メール受信のメソッドの戻り値がobject型で戻ってきます。
内部はsystem.arrayです。
option static on でプログラムしていています。

Dim files As Array = DirectCast(mailRcv, Array)

For Each v As String In files
    Dim retv As Object
    retv = bobj.ReadMail(szDir & "\" & v, "from:", szDir)

    If retv.GetType.IsArray Then
        Dim mc As String
        Dim rv As Array = DirectCast(retv, Array)
        Dim r As String() = DirectCast(rv, String())
            
        mc = bobj.Match("/(" & s(pattern) & ")/", r(1))
                                             '↑こうやって取り出したい
        If Len(mc) > 0 Then
            arrUrlList.Add(mc)
        End If
    End If
Next

これでビルドはできるのですが、実行時にsystem.object[]は
system.string[]に変換できないと怒られます。
option static offならOKなのですが、できればONの状態で
行いたいと思います。

今はいちおう、下記のように一度配列をコピーしていますが

Dim r As String() = New String(rv.Length - 1) {}
rv.CopyTo(r, 0)

配列をコピーして使うのでなく、直接インデックス指定で値を
取得する方法はないでしょうか?
よろしくお願いします。
■No16415に返信(たけっちさんの記事)
> System.Arrayからstring()へのキャストがわからないので教えてください。

ミニマム コードを書いてみましたが、普通にできるようです。

    Dim retv As Object = New String() {"中博俊", "じゃんぬ", "Jitta"}

    If TypeOf retv Is System.Array Then
        Dim rv As Array = DirectCast(retv, Array)
        Dim st As String() = DirectCast(rv, String())
    End If

> option static on でプログラムしていています。
> option static offならOKなのですが、できればONの状態で

Option Strict ではないのでしょうか?
SAFEARRAY を受け取る時は、属性で明示しなければ Object() で取得されるような。
となると変換は不可能ですが。

ややこしいことに、String() は Object() にキャストできるんですよねぇ。
この場合実体は String() ですので、後々 String() にダウンキャストも可能なんですが。
初めから Object() で作成したら要素が String しかなくてもダウンキャストはできません。

Dim a As Object() = New String(){"a", "b"}
Dim b As Object() = New Object(){"c", "d"}
Dim c As String() = DirectCast(a, String()) ' Success
Dim d As String() = DirectCast(b, String()) ' InvalidCastException
■No16418に返信(じゃんぬねっとさんの記事)

レスありがとうございます。
まとめレスで失礼します。

> ミニマム コードを書いてみましたが、普通にできるようです。

これは確かにキャスト出来ました。
Hongliangさんが書かれてますが、object型に登録時にstring()と
わかっているのでOKみたいですね。

> Option Strict ではないのでしょうか?

お恥ずかしい(^^; 書き間違えです。

■No16419に返信(Hongliangさんの記事)

> 初めから Object() で作成したら要素が String しかなくてもダウンキャストはできません。
> Dim b As Object() = New Object(){"c", "d"}
> Dim d As String() = DirectCast(b, String()) ' InvalidCastException

まさしく、これですね。
とりあえずは無理そうなので strict offか
配列をコピーして行うかのどちらかですね。

理由が分かったので、先に進めます。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板