Неявное преобразование VBScript в операторе IF, отличном от переменной, в литералы?
-
23-09-2019 - |
Вопрос
В настоящее время у нас возникла проблема из-за неявного преобразования в операторе IF в VBScript (классический ASP), который не выполняет неявное преобразование таким же образом при работе с переменной или литералом.Может ли кто-нибудь объяснить мне это поведение, почему VBScript действует таким образом?
Вот пример того, что я имею в виду :
Const c_test = 3
Dim iId : iId = 3
Dim iTestStr : iTestStr = "3"
If iId = iTestStr Then
Response.Write("Long variable = String variable : Equal")
Else
Response.Write("Long variable = String variable : Not Equal")
End If
Response.Write("<br/>")
If c_test = iTestStr Then
Response.Write("Long constant = String variable : Equal")
Else
Response.Write("Long constant = String variable : Not Equal")
End If
Response.Write("<br/>")
If c_test = iId Then
Response.Write("Long constant = Long variable : Equal")
Else
Response.Write("Long constant = Long variable : Not Equal")
End If
Response.Write("<br/>")
If iId = "3" Then
Response.Write("Long variable = String literal : Equal")
Else
Response.Write("Long variable = String literal : Not Equal")
End If
Response.Write("<br/>")
If c_test = "3" Then
Response.Write("Long constant = String literal : Equal")
Else
Response.Write("Long constant = String literal : Not Equal")
End If
Который выводит :
Длинная переменная = Строковая переменная :Не Равны
Длинная константа = Строковая переменная :Не Равны
Длинная константа = Длинная переменная :Равный
Длинная переменная = Строковый литерал :Равный
Длинная константа = Строковый литерал :Равный
Что довольно сбивает с толку o_O
Решение
Вы (неявно) объявляете свои переменные As Variant
так что ваш If
условия фактически проверяют равенство двух Variant
s и определите, что они неравны.
Однако в последних случаях вы используете String
константы (которые никогда не могут быть Variant
, даже если объявлено без типа) и String
литералы.
Мой догадываюсь это когда ты сравниваешь два Variant
s, VB сначала определяет, имеют ли они тег одного и того же типа, и если нет, решает False
.
Другие советы
Это результат одного документированного поведения и одного недокументированного.
Документированное поведение заключается в том, что при сравнениях число всегда меньше строки.Это упомянуто в документации для Операторы сравнения.Перефразируя таблицу в нижней части страницы:
Если одно выражение является числовым, а другое - строковым, тогда числовое выражение меньше, чем строковое выражение.
Недокументированное поведение заключается в том, что сравнения, включающие литералы, обрабатываются иначе, чем сравнения, включающие переменные.Видишь эта запись в блоге для получения более подробной информации.Подводя итог важному выводу:
Соответствующие правила сравнения в VB6 / VBScript выглядят следующим образом:
- Жесткая строка ~ жесткое число:преобразуйте строку в число, сравните числа
- Жесткая строка ~ мягкое число:преобразование числа в строку, сравнение строк
- Мягкая строка ~ твердое число:преобразуйте строку в число, сравните числа
- Мягкая строка ~ мягкое число:любая строка больше любого числа
Документированное поведение объясняет, почему первые два сравнения являются ложными, в то время как недокументированное поведение объясняет, почему последние два сравнения являются истинными.