2016-05-12 13 views
-1

VB.netで文字列連結を行っている間に、文字列を整数で連結しようとすると、奇妙なランタイムエラーが発生しました。ここでVisual Basicキャストの背後にある - 文字列から 'Double'型への変換が無効です

は私のバイオリンです:https://dotnetfiddle.net/NY4Y4V

Imports System 
Imports System.Collections.Generic 

Public Module Module1 
    Public Sub Main() 
     Dim t As Dictionary(Of Int32, DateTime?) = new Dictionary(Of Int32, DateTime?) 
     t.Add(12345, new DateTime()) 
     For Each f As KeyValuePair(Of Int32, DateTime?) In t 
      Console.WriteLine("Test string {" + f.Key + "}.") 
     Next 
    End Sub 
End Module 

具体的には、私はなぜ例外興味:

System.InvalidCastExceptionの:変換文字列から "テスト文字列{" 'ダブル' を入力します有効じゃない。

が発生しています。私は明示的に整数を文字列に変換する場合、これは簡単な修正であることを知っている:

Console.WriteLine("Test string {" + f.Key.ToString() + "}.") 

私は、この鋳造エラーが発生することを舞台裏で何が起こっているのか興味があるだけです。私はコード内のどこにいても倍精度浮動小数点型に触れていないので、 'Double'型のキャストがスローされる問題になるのは不明です。

答えて

3

VBの+オペレータは複雑な獣です。それは非常に行うことができますdifferent things depending on its operands。あなたのケースでは、そのテーブル内の3番目の行を次のようだ:

一つの式は、数値データ型で、もう一方は文字列のため

です:

オプション厳格な場合にコンパイルエラーが発生します。

厳格オプションは、暗黙のうちに文字列にダブルを変換して追加し、オフある場合。

文字列ダブルに変換できない場合は、InvalidCastException例外をスローします。

は、それはあなたのコード内のOffでなければならないOption Strictのように見えるので、それは確かにDoubleStringを変換しようと、ひいてはerroringされます。

理想的には、常にOption Strict On(およびOption Explicit On - 私はVBで作業しているときにチェックするのが最初です) - コンパイル時にあらゆる種類の潜在的なランタイムの問題が表示されます。

また、文字列連結を保証する場合は、Option Strictであるかどうかを確認するには、& operatorを使用します。

+0

'文字列の連結、オプションの厳密さを保証したい場合は、あなたの投稿でこれを言及してうれしい&演算子'を使うことができます。私は、私が働いている人々だけでなく、私が出会ったことのいくつかと噛み合っている無数の時間がどれくらいあるか分かりません。素晴らしい投稿! – Codexer

+0

偉大な答え、ありがとう! – thomasdclark

関連する問題