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

キャストが失敗します

環境/言語:[xp VS2002(Basic)]
分類:[.NET]

いつもお世話になります。
キャストについて教えて下さい

1.次のキャストは成功します。
Dim str2 As Object = New String() {"a", "b", "c"}
Dim str3() As String = DirectCast(str2, String())

2.次のキャストは失敗します。
Dim str2 As Object = New Object() {"a", "b", "c"}
Dim str3() As String = DirectCast(str2, String())

2.のキャストを成功させるためには
  Dim str3() As String = DirectCast(str2, String()) を
どのように記述すればよいのでしょうか?
宜しくお願いします。
Dim objects As Object() = New Object() {"a", "b", "c"}
Dim str3 As String() = New String(objects.Length - 1) {}

objects.CopyTo(str3, 0)

object[]なんてStringに対して使う場面はないが。
■No14471に返信(はいこーんさんの記事)

はいこーんさん 返信有難うございます。

> Dim objects As Object() = New Object() {"a", "b", "c"}
> Dim str3 As String() = New String(objects.Length - 1) {}
>
> objects.CopyTo(str3, 0)
>
これはわかりました。

ところで最初の質問は
> Dim objects As Object() = New Object() {"a", "b", "c"}
でなくて
     Dim objects As Object = New Object() {"a", "b", "c"}  ですから
> Dim str3 As String() = New String(objects.Length - 1) {} が使えません。

ですので上手くいきません。
■No14475に返信(エツさんの記事)
> ところで最初の質問は
> > Dim objects As Object() = New Object() {"a", "b", "c"}
> でなくて
> Dim objects As Object = New Object() {"a", "b", "c"}
> ですから
> > Dim str3  As String() = New String(objects.Length - 1) {}
> が使えません。
> ですので上手くいきません。

もうちょっと突っ込めばわかりますが、

    Private Shared Sub MakiMakiLove()
        Dim oSource As Object = New Object() {"1", "2", "3"}
        Dim oArray  As System.Array = DirectCast(oSource, System.Array)

        Dim strings As String() = New String(oArray.Length - 1) {}
        oArray.CopyTo(strings, 0)
    End Sub

というわけで、このような場合はそもそも Object 型は使わず、System.Array を使います。

> object[]なんてStringに対して使う場面はないが。

これは、上記の意味はなく、そのような型 (配列であることとか) を損失する場面はない。
ということなのでしょう。

__________________________________________________
じゃんぬ Microsoft MVP for Visual Developer - C#
  http://jeanne.wankuma.com/
  http://blogs.wankuma.com/jeanne/
■No14476に返信(じゃんぬねっとさんの記事)

じゃんぬねっとさん 有難うございます。


> もうちょっと突っ込めばわかりますが、
>
> Private Shared Sub MakiMakiLove()
> Dim oSource As Object = New Object() {"1", "2", "3"}
> Dim oArray As System.Array = DirectCast(oSource, System.Array)
>
> Dim strings As String() = New String(oArray.Length - 1) {}
> oArray.CopyTo(strings, 0)
> End Sub
>
> というわけで、このような場合はそもそも Object 型は使わず、System.Array を使います。
>

Objectの中身を一旦System.Arrayで配列にしてあとはコピーという手順ですね。
解決しました。
はいこーんさん、じゃんぬねっとさん 有難う御座いました。
今後とも宜しくお願いします。
解決済み!
  • 題名: Re[5]: キャストが失敗します
  • 著者: はいこーん
  • 日時: 2006/01/12 18:02:52
  • ID: 14487
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No14486に返信(エツさんの記事)
> Objectの中身を一旦System.Arrayで配列にしてあとはコピーという手順ですね。

いや、ちゃうんでない?

■No14476に返信(じゃんぬねっとさんの記事)
> > というわけで、このような場合はそもそも Object 型は使わず、System.Array を使います。

だからobjectに配列を格納する場面が想像できないんですよね。
値型と参照型のかけはしであっても。あるのかな?

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