Неявное преобразование VBScript в операторе IF, отличном от переменной, в литералы?

StackOverflow https://stackoverflow.com/questions/2356498

  •  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 условия фактически проверяют равенство двух Variants и определите, что они неравны.

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

Мой догадываюсь это когда ты сравниваешь два Variants, VB сначала определяет, имеют ли они тег одного и того же типа, и если нет, решает False.

Другие советы

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


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

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


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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top