2016-05-12 118 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。根据你的情况,它下面的第三排在该表:

一个表达式是数值数据类型而另一个是字符串

因此:

如果选项严格,然后生成一个编译器错误。

如果选项严格,则隐含转换字符串和补充。

如果字符串不能转换为,然后抛出一个InvalidCastException异常。

看起来Option Strict必须在你的代码Off,所以这的确是试图将String转换为Double,因此示数。

理想情况下,总是使用Option Strict On(和Option Explicit On-它们通常是我在使用VB时检查的第一件事) - 它会在编译时显示各种潜在的运行时问题。

另外,如果你想保证字符串连接,Option Strict或没有,你可以使用& operator

+0

'如果你想保证字符串连接,Option Strict与否,你可以使用&operator'很高兴你在你的文章中提到这个。我不知道有多少次这样咬我工作的人以及我遇到的一些事情。好帖子! – Codexer

+0

很好的答案,谢谢! – thomasdclark

相关问题