Lo que están viendo es un poco de código heredado mostrando su cabeza.
En el corazón del asunto está el tipo VT_BOOL. Visual Basic 6.0 utilizó el tipo VT_BOOL (AKA VARIANT_BOOL) para sus valores booleanos. Verdadero para un VARIANT_BOOL se representa con el valor VARIANT_TRUE que tiene el valor entero -1. Durante la conversión a .NET, se decidió que al usar las rutinas de conversión de Visual Basic para convertir un valor booleano a un valor entero, la semántica de Visual Basic 6.0 se mantendría en el valor de retorno; sería -1.
La primera conversión implícita se produce con la línea b = i. Debajo del capó esto hace una conversión implícita de entero a booleano. Cualquier valor distinto de cero se considera verdadero, por lo tanto, el valor resultante es verdadero.
Sin embargo, la siguiente línea de código está realizando una conversión implícita a un tipo entero.
Bajo el capó esta utiliza una de las rutinas de conversión de Visual Basic (CType o CInt) para convertir el valor a un número entero. Como tal, la semántica de Visual Basic está en juego y el valor devuelto es -1.
La siguiente línea interesante es la línea Convert.ToInt32()
. Esto está usando una rutina de conversión .NET que no usa la semántica de Visual Basic. En cambio, devuelve la representación subyacente BCL para un valor booleano verdadero que es 1.
Es posible que desee agregar algo acerca de POR QUÉ se usó VT_BOOL, y por qué su valor es -1. VB 6 solo tenía 1 conjunto de operadores "y" y "o", que realizaban operaciones lógicas y en modo bit (la mayoría de los idiomas tienen 2 juegos). Esto funcionó haciendo "y" implementado como "&" y tiene el valor predeterminado literal en -1. –
De esa manera "verdadero y x" no es cero en cualquier momento "x" no es cero. –
Puede obtener una idea del "por qué" en mi respuesta a una pregunta en gran parte no relacionada aquí: https://stackoverflow.com/a/46331671/3043 –