Division entière VB.NET vs C #

Quelqu’un veut-il expliquer pourquoi ces deux codes présentent des résultats différents?

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 

Lorsque vous regardez le code IL que ces deux extraits produisent, vous réaliserez que VB.NET convertit d’abord les valeurs entières en doubles, applique la division et arrondit le résultat avant qu’il ne soit reconverti en int32 et stocké dans y.

C # ne fait rien de tout ça.

Code IL de VB.NET:

 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 

Code C # IL:

 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 division entière “correcte” dans VB nécessite une barre oblique inverse: p \ i

En VB, pour faire la division entière , inversez la barre oblique:

 Dim y As Integer = p \ i 

sinon, il est étendu en virgule flottante pour la division, puis ramené à un int après avoir été arrondi lorsque y est affecté.

L’ opérateur de division entier VB.NET est \ , non / .

“La division est effectuée différemment dans C # et VB. Comme d’autres langages basés sur C, C # tronque le résultat de la division lorsque les deux opérandes sont des littéraux entiers ou des variables entières. Dans VB, vous devez utiliser l’opérateur de division entière pour obtenir un résultat similaire. ”

La source

En C #, la division entière est appliquée avec / lorsque le numérateur et le dénominateur sont des nombres entiers. Considérant que, dans VB.Net ‘/’ se traduit par une division en virgule flottante, donc pour la division entière dans VB.Net, utilisez \ . Jetez un oeil à cette publication MSDN .