Неявное преобразование VBScript в операторе IF отличается от переменной к литералу? - PullRequest
4 голосов
/ 01 марта 2010

В настоящее время у нас есть проблема из-за неявного преобразования в операторе IF в VBScript (Classic 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

Ответы [ 2 ]

4 голосов
/ 09 декабря 2012

Это результат одного документированного поведения и одного недокументированного.


Документированное поведение таково, что в сравнениях число всегда меньше строки. Это упоминается в документации для операторов сравнения . Перефразируя таблицу в нижней части страницы:

Если одно выражение является числовым, а другое - строкой, , тогда числовое выражение меньше строкового выражения.


Недокументированное поведение заключается в том, что сравнения с использованием литералов обрабатываются иначе, чем сравнения с использованием переменных. См. эту запись в блоге для более подробной информации. Подводя итог важному выводу:

Соответствующие правила сравнения в VB6 / VBScript выглядят так:

  • Жесткая строка ~ жесткое число: преобразовать строку в число, сравнить числа
  • Жесткая строка ~ мягкое число: преобразовать число в строку, сравнить строки
  • Мягкая строка ~ жесткое число: преобразовать строку в число, сравнить числа
  • Мягкая строка ~ мягкое число: любая строка больше любого числа

Документированное поведение объясняет, почему первые два сравнения ложны, а недокументированное поведение объясняет, почему последние два сравнения верны.

1 голос
/ 01 марта 2010

Вы (неявно) объявляете свои переменные As Variant, поэтому ваши условия If фактически проверяют равенство двух Variant с и определяют, что они неравны.

Однако в последних случаях вы используете String константы (которые никогда не могут быть Variant, даже если объявлены без типа) и String литералы.

Моя догадка заключается в том, что при сравнении двух Variant с VB сначала определяет, имеют ли они одинаковый тег типа, а если нет, разрешается в False.

...