novedades - new features c#
División de enteros VB.NET vs C# (5)
Esta pregunta ya tiene una respuesta aquí:
¿Alguien quiere explicar por qué estos dos códigos muestran resultados diferentes?
VB.NET v4.0
Dim p As Integer = 16
Dim i As Integer = 10
Dim y As Integer = p / i
//Result: 2
C # v4.0
int p = 16;
int i = 10;
int y = p / i;
//Result: 1
"La división se realiza de forma diferente en C # y VB. C #, como otros lenguajes basados en C, trunca el resultado de división cuando ambos operandos son literales enteros o variables enteras (o constantes enteras) .En VB, debe usar el operador de división de enteros ( /
) para obtener un resultado similar ".
Cuando mira el código IL que producen esos dos fragmentos, se dará cuenta de que VB.NET primero convierte los valores enteros en dobles, aplica la división y luego redondea el resultado antes de volver a int32 y guardarlo en y.
C # no hace nada de eso.
Código VB.NET IL:
IL_0000: ldc.i4.s 10
IL_0002: stloc.1
IL_0003: ldc.i4.s 0A
IL_0005: stloc.0
IL_0006: ldloc.1
IL_0007: conv.r8
IL_0008: ldloc.0
IL_0009: conv.r8
IL_000A: div
IL_000B: call System.Math.Round
IL_0010: conv.ovf.i4
IL_0011: stloc.2
IL_0012: ldloc.2
IL_0013: call System.Console.WriteLine
C # IL Código:
IL_0000: ldc.i4.s 10
IL_0002: stloc.0
IL_0003: ldc.i4.s 0A
IL_0005: stloc.1
IL_0006: ldloc.0
IL_0007: ldloc.1
IL_0008: div
IL_0009: stloc.2
IL_000A: ldloc.2
IL_000B: call System.Console.WriteLine
La división entera "correcta" en VB necesita una barra invertida: p / i
El operador de división de enteros de VB.NET es /
, not /
.
En C #, la división entera se aplica con /
cuando tanto el numerador como el denomenator son enteros. Mientras que, en VB.Net ''/'' da como resultado la división de coma flotante, por lo que para la división de enteros en VB.Net use /
. Eche un vistazo a esta publicación de MSDN .
En VB, para hacer una división entera , invierta la barra:
Dim y As Integer = p / i
de lo contrario, se expande a punto flotante para la división, luego se vuelve a forzar a un int
después del redondeo cuando se asigna a y
.