Qu'est-ce que vous voyez est un peu de code existant montrant sa tête.
Au cœur de la question est le type de VT_BOOL. Visual Basic 6.0 utilisait le type VT_BOOL (AKA VARIANT_BOOL) pour ses valeurs booléennes. True pour un VARIANT_BOOL est représenté avec la valeur VARIANT_TRUE qui a la valeur entière -1. Au cours de la conversion en .NET il a été décidé que lors de l'utilisation des routines de conversion Visual Basic pour convertir une valeur booléenne à une valeur Integer, Visual Basic 6.0 sémantique serait maintenue sur la valeur de retour; ce serait -1.
La première conversion implicite se produit avec le b = i lignes. Sous le capot, cela fait une conversion implicite d'entier en booléen. Toute valeur non nulle est considérée comme vraie, donc la valeur résultante est vraie.
Cependant, la ligne de code suivante effectue une conversion implicite en un type entier.
Sous le capot celui-ci utilise l'une des routines de conversion Visual Basic (CType ou CInt) pour convertir la valeur à un nombre entier. En tant que telle sémantique Visual Basic sont en jeu et la valeur renvoyée est -1.
La prochaine ligne intéressante est la ligne Convert.ToInt32()
. Cela utilise une routine de conversion .NET qui n'utilise pas la sémantique Visual Basic. Au lieu de cela, il retourne la représentation sous-jacente BCL pour une valeur booléenne vraie qui est 1.
Vous voudrez peut-être ajouter quelque chose à propos de WHY VT_BOOL a été utilisé, et pourquoi sa valeur est -1. VB 6 ne disposait que d'un ensemble d'opérateurs "and" et "or", qui effectuaient des opérations logiques et binaires (la plupart des langages ont 2 ensembles). Cela a fonctionné en faisant "et" implémenté comme "&" et ont la valeur par défaut littérale à -1. –
De cette façon "true et x" est non nul à tout moment "x" est non nul. –
Vous pouvez avoir une idée du "pourquoi" dans ma réponse à une question la plupart du temps ici: https://stackoverflow.com/a/46331671/3043 –