有人愿意解释为什么这两段代码显示出不同的结果吗?

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

推荐答案

当你看到这两个代码片段产生的IL代码时,你会意识到VB.NET首先将整数值转换为双精度,应用除法,然后对结果进行舍入,然后再将其转换回int32并存储在y中.

C#不做这些.

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代码:

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

VB中的"正确"整数除法需要一个向后劈开:p\i

.net相关问答推荐

DI通过对象的接口而不是实际类型来解析服务

.NET restore/build在使用组织包的Github Action工作流中调用时获得401

为什么这个同步运行的异步睡眠会挂起?

CustomControl 计算自己的宽度和高度 - 使用 bounds.Height=0 调用 ArrangeOverride

C#/.NET + VisualStudio,命名空间问题

在.NET C#中截断整个单词的字符串

无法解析此引用.找不到程序集

将屏幕捕获为位图

静态代码块

为什么字典比列表快得多?

测试没有预期的异常

如何从 .NET 中的流中获取 MemoryStream?

当程序员说针对接口而不是对象的代码时,他们是什么意思?

为什么使用 ImmutableList 而不是 ReadOnlyCollection?

如何保护我的 .NET 程序集免受反编译?

DataGridView 在我的两个屏幕之一上的可怕重绘性能

.NET 配置文件 configSource 在应用程序目录文件夹之外

我应该绑定到 ICollectionView 还是 ObservableCollection

使用没有catch块的try-finally块

多行 C# 插值字符串文字