Преобразование компилятором VB строки в число

#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.