INFORMACIÓN: Variable reglas de conversión en Visual Basic

Seleccione idioma Seleccione idioma
Id. de artículo: 129803 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Expandir todo | Contraer todo

En esta página

Resumen

Cuando dos o más variables de diferentes tipos implicadas en una expresión, Visual Basic utiliza un conjunto de reglas de conversión de tipos interna para cambiar los distintos tipos a un tipo único. Para cada combinación de tipos de entrada y resultado, hay una regla de conversión específicos. (Contrariamente a algunas conjeturas variantes no intervienen.) Esto hace que Visual Basic más rápido y eficaz, pero pueden producir algunos resultados desconcierta si no son conscientes de lo que hace Visual Basic en segundo plano. En este artículo presenta algunas de las reglas de conversión menos obvias, sus ventajas y algunas posibles situaciones donde esto puede conducir a resultados inesperados.

Más información

Conversión entre tipos numéricos es bastante sencillo. Tipos más pequeños (entero) que se convierten en tipos de mayores (double) sólo tienen su valor asignado. Tipos de mayores (double) convierten a tipos más pequeños (entero) tienen su valor asignado, pero generan un error desbordamiento si el tipo más pequeño no puede contener valor del tipo de mayor. Otras reglas de conversión no son tan obvios.

Nota : se puede convertir implícitamente cualquier tipo a cualquier otro tipo (excepto los objetos).
   Source Type    Coerced to      Apply this rule
   --------------------------------------------------------------

   Integer        Boolean         0=False, non-zero=True

   Boolean        Byte            False=0, True=255

   Boolean        any numeric     False=0, True=-1
                  (except Byte)

   String         Date            String is analyzed for mm/dd/yy,
                                  and so on

   Date           numeric type    Coerce to Double and use
                                  DateSerial(Double)

   numeric type   Date            Use number as serial date, check
                                  valid date range

   numeric type   Byte            Error if negative

   String         numeric type    Strings are treated as a Double
                                  when they need to represent a
                                  number
				
algunas de estas reglas permiten sintaxis simplificada al escribir el código. Por ejemplo:
   ReturnCode% = FunctionThatReturnsAnInteger()
   If (ReturnCode%) Then ...
				
este fragmento de código aprovecha el entero implícita de conversión de tipo Boolean y correctamente evalúa la expresión en si la instrucción.

Nota en cadenas como números

Tratando cadenas como dobles cuando necesitan para representar un número proporciona la cadena el rango máximo posible y casi la mejor precisión posible (moneda sólo puede tener más precisión, en un sacrificio de intervalo). Debido a estas conversiones son generados por el compilador, la regla debe ser decidida por adelantado sin respecto el contenido real de la cadena.

Observe que la "trata como Double" no es bastante el mismo que "la conversión a Double." Por ejemplo, operadores de suma y resta tratan moneda como un tipo preferible a Double. Divisa más String se tratarán como divisa más Double, que se utilizaría la adición de moneda. Por tanto, la cadena se puede convertir directamente a la moneda.

¿Por qué utilizar reglas de conversión?

La razón más grande es rendimiento. Las reglas de conversión rígida que Visual Basic versión 4.0 más rápido y eficaz y proporcionan compatibilidad con versiones anteriores de Visual Basic. Una de las ventajas de gran velocidad procede porque Visual Basic versión 4.0 ahora conoce el tipo de datos de las propiedades del control. Conocer el tipo de propiedades proporciona trememdous ventajas de rendimiento. Sin él, por ejemplo, establecer una propiedad necesario Basic a empaquetar el valor de un valor de tipo Variant y el control para desempaquetar y convertir al tipo correcto. Ahora sabe que el control está recibiendo el tipo de específico correcto y hace básica una conversión directa a ese tipo sin involucrar nunca la sobrecarga de un valor de tipo Variant.

Resultados inesperados

Los fragmentos de código siguiente muestran unos cuantos escenarios comunes donde se pueden generar errores por Visual Basic si tipos y las reglas de conversión no se consideran cuidadosamente:
   Dim I As Integer, J As Integer
   Dim L As Long, M As Long
   Dim S As String

   I = 32767
   L = 32767
   M = 1
   S = "Hello World!"

   J = I + 1
   ' Overflow. Integer upper limit = 32767. No coercion applied.

   J = I + M
   ' Overflow. I+M is coerced to a Long and the value 32768 is generated,
   ' but when the assignment operator is resolved, this Long value is
   ' coerced back to Integer (J's type) and overflows.

   L = I + 1
   ' Overflow. Coercion is not applied until the assignment operator is
   ' resolved. I + 1 'Overflow's the temporary Integer variable created
   ' to resolve the plus operator.

   If I Then Print "I is True"
   If Not I Then Print "Not I is True"
   ' This prints both 'I is True and Not I is True', a logical
   ' contradiction. The value of I = 32767, which is non-zero and under
   ' the Integer to Boolean rule, is coerced to True. With 'Not I',
   ' the NOT operator is applied first, which produces -32768 which is
   ' also non-zero and, therefore, True.
				
el escenario siguiente muestra cómo una conversión implícita puede generar una variedad de resultados inesperados. Puede agregar este código a un nuevo programa es demasiado ver el resultado de ejecución.
   Private Sub Form_Click()
      Call MySub(1, 23) '<-- Note: passing *numbers*!
   End Sub

   Private Sub MySub (a As String, b As String)
      Debug.Print "a = "; a, , TypeName(a)
      Debug.Print "b = "; b, , TypeName(b)
      Debug.Print "a + b = "; a + b, , TypeName(a + b)
      Debug.Print "a + b - 1 ="; a + b - 1, TypeName(a + b - 1)
      Debug.Print "1 - a + b ="; 1 - a + b, TypeName(1 - a + b)
      Debug.Print "a + b + 1 ="; a + b + 1, TypeName(a + b + 1)
      Debug.Print "1 + a + b ="; 1 + a + b, TypeName(1 + a + b)
      Debug.Print "(1 + b) / a ="; (1 + b) / a, TypeName((1 + b) / a)
   End Sub
				
The output is:
   a = 1             String
   b = 23            String
   a + b = 123       String
   a + b - 1 = 122   Double
   1 - a + b = 23    Double
   a + b + 1 = 124   Double
   1 + a + b = 25    Double
   (1 + b) / a = 24  Double
				

Propiedades

Id. de artículo: 129803 - Última revisión: sábado, 22 de febrero de 2014 - Versión: 2.0
La información de este artículo se refiere a:
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 6.0 Edición de aprendizaje
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
  • Microsoft Visual Basic 4.0 Standard Edition
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic 4.0 16-bit Enterprise Edition
  • Microsoft Visual Basic 4.0 32-Bit Enterprise Edition
Palabras clave: 
kbnosurvey kbarchive kbmt kbinfo KB129803 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 129803

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com