VBScript implicit conversion in IF statement different from variable to literals?
We are currently having an issue due to implicit conversion in an IF statement in VBScript (Classic ASP) that don't do implicit conversion the same way when dealing with a variable or a literal. Can someone explain this behavior to me, why do VBScript acts this way ?
Here is a sample of what I mean :
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
Which ouputs :
Long variable = String variable : Not Equal
Long constant = String variable : Not Equal
Long constant = Long variable : Equal
Long variable = String literal : Equal
Long constant = String literal : 开发者_如何学GoEqual
Which is quite confusing o_O
This is the result of one documented behavior and one undocumented one.
The documented behavior is that in comparisons, a number is always less than a string. This is mentioned in the documentation for Comparison Operators. Paraphrasing the table near the bottom of the page:
If one expression is numeric and the other is a string, then the numeric expression is less than the string expression.
The undocumented behavior is that comparisons involving literals are handled differently from comparisons involving variables. See this blog entry for more details. To summarize the important conclusion:
The relevant comparison rules in VB6/VBScript go like this:
- Hard string ~ hard number: convert string to number, compare numbers
- Hard string ~ soft number: convert number to string, compare strings
- Soft string ~ hard number: convert string to number, compare numbers
- Soft string ~ soft number: any string is greater than any number
The documented behavior explains why the first two comparisons are false, while the undocumented behavior explains why the last two comparisons are true.
You are (implicitly) declaring your variables As Variant
so your If
conditions actually test the equality of two Variant
s and determine that they are unequal.
In the last cases, however, you are using String
constants (which can never be Variant
, even if declared without a type) and String
literals.
My guess is that when you compare two Variant
s, VB first determines whether they have the same type tag and if they don’t, resolves to False
.
精彩评论