InvalidCastException について

初級者向けにおさらいします。

目次

この例外エラーの説明

Invalid Cast(無効なキャスト(型変換の意味)をしようとすると発生する)Exception です。つまり現在の型から変換先の型には変換できないよという意味です。

事例とその対処方法

例外エラーは、想定外の扱われ方をすると発生して飛んで来ます。それは命令の使い方が間違っていたり、存在しないデータを扱おうとしていたり、アカウント権限を越えたアクセスをしようとしていたり(Windows 側やウェブ側の話だったり)、サービスが動いていないのに連携しようとしたり、製品上の仕様考慮モレだったり、そういう系です。

こうなっている前提のはずだから、こうやろうとしたのに、実際はここがこうなっているからダメじゃん!こういう場合の処理が無いじゃん!みたいなコードになっていませんか?

String

無効な型変換というのは、例えば以下です。漢字の1000は数値に変換できません。

Dim s As String = "千"
Dim i As Integer = CInt(s)
System.InvalidCastException: 'String "千" から型 'Integer' への変換は無効です。'

Class の継承関連

継承先クラス(サブクラス、子クラス)→継承元クラス(スーパークラス、親クラス、ベースクラス)への型変換は可能ですが、逆の変換はできません。子供は親の能力を受け継ぐが、親は子供の能力は受け継がない、という関係と同じですね。

子供のインスタンスを親変数は背負うことができますが、親のインスタンスは子供変数には背負うことはできません。

Class Base
    Public BaseNumber As Integer
End Class

Class Extends
    Inherits Base
    Public ExtendsName As String
End Class

Module Module1

    Sub Main()

        Dim baseObj As New Base
        Dim exObj As Extends = CType(baseObj, Extends)


        Console.ReadKey()
    End Sub

End Module
System.InvalidCastException: '型 'ConsoleApp1.Base' のオブジェクトを型 'ConsoleApp1.Extends' にキャストできません。'

こちらの方が分かりやすいかもしれません。もう1つの事例です。

Class Parent
    Public BaseNumber As Integer
End Class

Class Sister
    Inherits Parent
    Public ExtendsName As String
End Class

Class Brother
    Inherits Parent
    Public NewNumber As Double
End Class

Module Module1

    Sub Main()

        Dim parentObj As Parent = New Sister
        Dim brotherObj As Brother = CType(parentObj, Brother)


        Console.ReadKey()
    End Sub

End Module
System.InvalidCastException: '型 'ConsoleApp1.Sister' のオブジェクトを型 'ConsoleApp1.Brother' にキャストできません。'