今天我了解到下面的代码是非法的,因为res2最终是一个长的.

        public void test(int intVal1, int intVal2, uint uintVal)
        {
            int res1 = intVal1 * intVal2;
            int res2 = intVal1 * uintVal;
        }

见下面的屏幕截图,显示使用long.operator *进行乘法,大概是因为uint的正值范围比int所能表示的范围更大.这有点道理,但是两个带符号的整数的乘法也很容易溢出,所以为什么要对uint额外苛刻呢?

enter image description here

我从C#一开始就一直在编写它,所以我很惊讶现在就遇到了它.当涉及到一个单位而不是两个整数时,有充分的理由晋升为多头吗?

推荐答案

这是由于数字类型的推广.从ECMA-334:2023 C#标准开始:

12.4.7.3 Binary numeric promotions

对于预定义的+、-、*、/、...二进制数值提升将两个操作数隐式转换为公共类型 在非关系运算符的情况下,它也成为运算的结果类型.二进位 数字升级包括按以下规则在此处显示的顺序应用这些规则:

·如果任一操作数为DECIMAL类型...

...

·否则,如果一个操作数的类型为uint,另一个操作数的类型为sbyte、short或int, 两个操作数都被转换为类型long.

...

Csharp相关问答推荐

使用ElasticsearchClient设置忽略属性.默认MappingFor<>

C#将参数传递给具有变化引用的变量

一种安全的方式来存储SSH凭证(MAUI/C#应用程序)

找不到网址:https://localhost:7002/Category/Add?区域= Admin.为什么我的URL是这样生成的?area = Admin而不是/Admin/

Entity Framework Core 8 dbcontext—无法以多对多关系添加某些行'

NumPy s fftn in C#with pythonnet'

需要澄清C#的Clean Architecture解决方案模板的AuditableEntityInterceptor类

如何注销Microsoft帐户?

. net依赖注入如何避免服务类中的新

使用C#HttpClient以多部分形式数据发送带有非ASCII文件名的文件的问题

在具有不同属性名称的两个类之间创建关系

TCPClient阅读流

Unix上的.NET(核心):.NET意外地未看到通过P/Invoke系统调用对环境变量进行的进程内修改

如何使用MailKit删除邮箱?

是否有必要在ASP.NET Core中注册可传递依赖项?

Linux Docker上的.NET6在某个时间抛出后,在加密操作期间发生System.Security.Cryptography.CryptographicException:错误

我可以查看我们向应用程序洞察发送了多少数据吗?

C#中COM对象的实际地址

仅在Blazor Web App中覆盖生产的基本路径(.NET8中的_Hosts.cshtml文件功能?)

为什么连接到Google OAuth2后,结果.Credential为空?