#vb.net #type-conversion
#vb.net #преобразование типа
Вопрос:
Это скорее любопытный вопрос о том, что делает компилятор VB. В основном следующий код генерирует ошибку,
If "String" = CInt(1) Then
End If
Как и должно быть. Что меня интересует, так это сообщение об ошибке
Conversion from string "String" to type 'Double' is not valid.
Итак, я предполагаю, что мой вопрос в том, почему компилятор пытается преобразовать в Double, когда я предполагаю, что он должен преобразовываться в Integer?
Комментарии:
1. Это больше связано с расширением типа, чем с преобразованием типа.
2. Похоже, что нет тега ‘type-promotion’. Но да, я думаю, вы правы.
Ответ №1:
Следующее может дать некоторую подсказку.
Для следующего
If "String" = CInt(1) Then
End If
Трассировка стека innerexception показывает
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, как указано выше.
Это означает, что оно ничего не должно делать со значением в правой части. Это поведение компилятора при выполнении неявного преобразования для преобразования строки в более подходящий тип данных, который является double (long было бы слишком длинным — каламбур).
Это поведение может быть доказано путем изменения инструкции на :
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 (наиболее подходящий), а затем преобразует ее в integer.