tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル'System.InvalidCastException'
記事No5391
投稿日: 2007/04/20(Fri) 17:37
投稿者ひでと
お世話になります。
下のようなFunctionを作り、「文字として入力した数字」を 強制的に数字に変換しようとしています。
エラーはトラップできているようなのですが、イミディエイトウインドウに、
  「'System.InvalidCastException' の初回例外が
Microsoft.VisualBasic.dll で発生しました。」
と毎回でてきます。
これを避ける方法は無いでしょうか。

Public Function 文字to数字(ByVal 文字 As String) As Object
        文字to数字 = 文字
        If 文字 = "" Then Exit Function
        Try
            If 文字 = CStr(CShort(文字)) Then 文字to数字 = CShort(文字) : Exit Try
            If 文字 = CStr(CInt(文字)) Then 文字to数字 = CInt(文字) : Exit Try
            If 文字 = CStr(CLng(文字)) Then 文字to数字 = CLng(文字) : Exit Try
            If 文字 = CStr(CSng(文字)) Then 文字to数字 = CSng(文字) : Exit Try
            If 文字 = CStr(CDbl(文字)) Then 文字to数字 = CDbl(文字) : Exit Try
        Catch ex As System.Exception
            Exit Function
        End Try
    End Function

[ツリー表示へ]
タイトルRe: 'System.InvalidCastException'
記事No5399
投稿日: 2007/04/23(Mon) 22:17
投稿者なおこ(・∀・)
お世話になります。

> エラーはトラップできているようなのですが、イミディエイトウインドウに、
>   「'System.InvalidCastException' の初回例外が
> Microsoft.VisualBasic.dll で発生しました。」
> と毎回でてきます。
> これを避ける方法は無いでしょうか。

Cast 可能かどうかを調べた上で Cast したほうが確実です。
実行コストも低くなると思います。
.NET Framework のバージョンがわかりませんが、
TryParse 等を使って調べたりとか。

[ツリー表示へ]
タイトルRe^2: 'System.InvalidCastException'
記事No5400
投稿日: 2007/04/24(Tue) 09:26
投稿者ひでと
ありがとうございました。
>
> Cast 可能かどうかを調べた上で Cast したほうが確実です。
> 実行コストも低くなると思います。
> .NET Framework のバージョンがわかりませんが、
> TryParse 等を使って調べたりとか。
以下で、できました。

    Public Function 文字to数字(ByVal 文字 As String) As Object
        Dim returnValue As Boolean
        文字to数字 = 文字
        If 文字 = "" Then Exit Function
        Dim r1 As Short : returnValue = Short.TryParse(文字, r1)
        If returnValue = True Then 文字to数字 = CShort(文字) : Exit Try

        Dim r2 As Integer : returnValue = Integer.TryParse(文字, r2)
        If returnValue = True Then 文字to数字 = CInt(文字) : Exit Try

        Dim r3 As Long : returnValue = Long.TryParse(文字, r3)
        If returnValue = True Then 文字to数字 = CLng(文字) : Exit Try

        Dim r4 As Single : returnValue = Single.TryParse(文字, r4)
        If returnValue = True Then 文字to数字 = CSng(文字) : Exit Try

        Dim r5 As Double : returnValue = Double.TryParse(文字, r5)
        If returnValue = True Then 文字to数字 = CDbl(文字) : Exit Try
    End Function

[ツリー表示へ]
タイトル訂正
記事No5401
投稿日: 2007/04/24(Tue) 10:06
投稿者ひでと
Exit Try でなく Exit Functionでした。

[ツリー表示へ]
タイトルRe: 訂正
記事No5402
投稿日: 2007/04/24(Tue) 10:58
投稿者魔界の仮面弁士
> Exit Try でなく Exit Functionでした。
今回の場合、Return ステートメントを使った方がスッキリするかと。

それと、TryParse メソッドは Parse メソッドと対になるものです。
TryParse/Parse の判定基準と CSng 等の判定基準は異なるので、統一した方が良いかも。

[ツリー表示へ]
タイトルRe^2: 訂正
記事No5407
投稿日: 2007/04/24(Tue) 16:48
投稿者ひでと
ありがとうございました。ご連絡が遅くなり失礼しました。
> > Exit Try でなく Exit Functionでした。
> 今回の場合、Return ステートメントを使った方がスッキリするかと。
>
> それと、TryParse メソッドは Parse メソッドと対になるものです。
> TryParse/Parse の判定基準と CSng 等の判定基準は異なるので、統一した方が良いかも。
下のよねKEN様のアドバイスのことですね。
まだまだ、なれないもので勉強になります。

[ツリー表示へ]
タイトルRe^3: 'System.InvalidCastException'
記事No5405
投稿日: 2007/04/24(Tue) 13:01
投稿者よねKEN
>         Dim r1 As Short : returnValue = Short.TryParse(文字, r1)
>         If returnValue = True Then 文字to数字 = CShort(文字) : Exit Try

文字to数字 = CShort(文字)
のところは
文字to数字 = r1
とすべきでしょう。せっかくShort型のデータへ変換しているのですし。

他のパターンも同様に。

[ツリー表示へ]
タイトルRe^4: 'System.InvalidCastException'
記事No5408
投稿日: 2007/04/24(Tue) 16:50
投稿者ひでと
ありがとうございました。
いわれてみればなるほどです。教えていただいた内容を上っ面だけで納得してしまい
考えがい足りませんでした。アドバイスありがとうございます。

> >         Dim r1 As Short : returnValue = Short.TryParse(文字, r1)
> >         If returnValue = True Then 文字to数字 = CShort(文字) : Exit Try
>
> 文字to数字 = CShort(文字)
> のところは
> 文字to数字 = r1
> とすべきでしょう。せっかくShort型のデータへ変換しているのですし。
>
> 他のパターンも同様に。

[ツリー表示へ]
タイトルRe^3: 'System.InvalidCastException'
記事No5406
投稿日: 2007/04/24(Tue) 14:25
投稿者なおこ(・∀・)
お世話になります。

魔界の仮面弁士さんや、よねKENさんからアドバイスがあった通り
こんな感じでもう少しすっきりできるのでは。

    Public Function 文字to数字(ByVal 文字 As String) As Object
        If Not String.IsNullOrEmpty(文字) Then
            Dim shortValue As Short
            If Short.TryParse(文字, shortValue) Then Return shortValue

            Dim intValue As Integer
            If Integer.TryParse(文字, intValue) Then Return intValue

            Dim longValue As Long
            If Long.TryParse(文字, longValue) Then Return longValue

            Dim singleValue As Single
            If Single.TryParse(文字, singleValue) Then Return singleValue

            Dim doubleValue As Double
            If Double.TryParse(文字, doubleValue) Then Return doubleValue
        End If
        Return 文字
    End Function

[ツリー表示へ]
タイトルRe^4: 'System.InvalidCastException'
記事No5409
投稿日: 2007/04/24(Tue) 16:58
投稿者ひでと
ありがとうございます。
アドバイスいただいた方に改めて御礼申し上げます。
VS2005をいじり始めて、まだ数週間といったところです。
VB6で挫折していたクラスの利用が、VS2005になって急に理解が出来てきました。
これも皆様のご助言によるものです。ありがとうございます。

現在は「継承」と「namespace」「イベント」の理解を進めながら、過去数年間
やりたくてたまらなかったものに挑戦しています。出来そうな気がしております。
今後もよろしくお願いします。

> お世話になります。
>
> 魔界の仮面弁士さんや、よねKENさんからアドバイスがあった通り
> こんな感じでもう少しすっきりできるのでは。
>
>     Public Function 文字to数字(ByVal 文字 As String) As Object
>         If Not String.IsNullOrEmpty(文字) Then
>             Dim shortValue As Short
>             If Short.TryParse(文字, shortValue) Then Return shortValue
>
>             Dim intValue As Integer
>             If Integer.TryParse(文字, intValue) Then Return intValue
>
>             Dim longValue As Long
>             If Long.TryParse(文字, longValue) Then Return longValue
>
>             Dim singleValue As Single
>             If Single.TryParse(文字, singleValue) Then Return singleValue
>
>             Dim doubleValue As Double
>             If Double.TryParse(文字, doubleValue) Then Return doubleValue
>         End If
>         Return 文字
>     End Function

[ツリー表示へ]