2010-03-01 3 views
4

Nous avons actuellement un problème dû à la conversion implicite dans une instruction IF dans VBScript (ASP classique) qui n'effectue pas la conversion implicite de la même manière lorsqu'il s'agit d'une variable ou d'un littéral. Quelqu'un peut-il m'expliquer ce comportement, pourquoi VBScript agit-il de cette façon?Conversion implicite VBScript dans une instruction IF différente de la variable en littéraux?

Voici un échantillon de ce que je veux dire:

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 

qui Ouputs:

variable à long = Variable chaîne: Non égal

longue constante = Variable chaîne: Non égal

Constante longue = Variable longue: Égal

variable à long = chaîne littérale: l'égalité

longue constante = chaîne littérale: l'égalité

Ce qui est assez déroutant o_O

Répondre

1

Vous (implicitement) déclarez vos variables As Variant afin que vos If conditions réellement tester l'égalité de deux Variant s et déterminent qu'ils sont inégaux.

Dans les derniers cas, cependant, vous utilisez String constantes (qui ne peuvent jamais être Variant, même si elles sont déclarées sans type) et String littéraux.

Ma conjecture est que lorsque vous comparez deux Variant s, VB détermine d'abord si elles ont la même étiquette de type et si elles ne le font pas, décide de False.

+1

J'ai testé les types de variables et de constantes avec la fonction VBScript "VarType", et aucun d'entre eux est Variant, il s'avère qu'ils sont vbInteger (pour le iId et c_test) et vbString pour iTestStr. Par ailleurs, VBScript n'autorise pas la déclaration de type de variable. – MaxiWheat

+1

@Maxi: J'avais oublié ça. Mais les variables sont * still * de type 'Variant', et' VarType' en fait * extrait * la balise de type d'un 'Variant', ce qui explique pourquoi vous obtenez un autre résultat. 'VarType' peut aussi renvoyer' vbVariant', mais c'est seulement le cas pour * array * de 'Variant's. –

+0

Je vais accepter votre solution qui semble logique, même si je n'ai aucun moyen de confirmer que c'est tout à fait raison ;-) – MaxiWheat

4

Ceci est le résultat d'un comportement documenté et d'un comportement non documenté.


Le comportement documenté est que dans les comparaisons, un nombre est toujours inférieur à une chaîne. Ceci est mentionné dans la documentation pour Comparison Operators. Paraphrasant la table près du bas de la page:

Si une expression est numérique et l'autre est une chaîne, puis l'expression numérique est inférieure à l'expression de chaîne.


Le comportement non documenté est que les comparaisons impliquant littéraux sont traitées différemment des comparaisons portant sur des variables. Voir this blog entry pour plus de détails.Pour résumer la conclusion importante:

Les règles de comparaison pertinentes dans VB6/VBScript vont comme ceci:

  • chaîne dur ~ Numéro dur: chaîne convertir en nombre, comparer les numéros
  • chaîne dur ~ douce nombre: convertir le nombre en chaîne, comparer les chaînes
  • Chaîne douce ~ nombre dur: convertir la chaîne en nombre, comparer les nombres
  • Chaîne douce ~ nombre mou: toute chaîne est plus grande que n'importe quel nombre

Le comportement documenté explique pourquoi les deux premières comparaisons sont fausses, alors que le comportement non documenté explique pourquoi les deux dernières comparaisons sont vraies.

Questions connexes