这更多是关于VB编译器正在做什么的好奇心问题。基本上,以下代码会生成错误,
If "String" = CInt(1) Then
End If
应该如此。让我好奇的是报告的错误是
Conversion from string "String" to type 'Double' is not valid.
所以,我想我的问题是,为什么编译器会尝试转换为Double,因为我认为它应该转换为Integer?
答案 0 :(得分:2)
以下可以给出一些提示。
以下
If "String" = CInt(1) Then
End If
innerexception stacktrace显示
at Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble(String Value, NumberFormatInfo NumberFormat)
at Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble(String Value)
即使您将声明更改为
If "String" = CDbl(1) Then
或
If "String" = CDec(1) Then
它仍然显示上面给出的innerexception stacktrace。
这意味着它必须对右侧值无效。这是编译器的行为,同时进行隐式转换以将字符串转换为更容易接受的数据类型,这是双倍的(长的将是太长的双关语)。
可以通过将语句更改为:
来证明此行为If CInt("String") = CLng(1) Then
End If
为此,innerexception stacktrace显示
at Microsoft.VisualBasic.CompilerServices.Conversions.ParseDouble(String Value, NumberFormatInfo NumberFormat)
at Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(String Value)
这意味着即使对于显式类型转换,它首先尝试将字符串转换为double(最适应),然后将其转换为整数。