You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何ushort变量两种赋值方式的编译结果不同?

问题解答

这个int来自C#的整数算术运算类型提升规则,具体原因拆成两种情况解释:

为什么第一种赋值方式不报错?

看这段代码:

longitudTotal = longitudTrama;
longitudTotal += HEADER_LENGTH;
longitudTotal += CHECKSUM_LENGTH;

这里用的是+=复合赋值运算符,C#对这类运算符做了特殊处理:它会先执行加法运算(此时longitudTotal和HEADER_LENGTH都会被提升为int,运算结果是int),然后自动将结果截断并转换回左操作数的类型(也就是ushort)——这个转换是编译器自动完成的,不需要手动写强制转换,所以不会报错。

为什么第二种赋值方式会报错?

再看这段代码:

longitudTotal = longitudTrama + HEADER_LENGTH + CHECKSUM_LENGTH;

这里是直接进行连续的加法运算,根据C#的规则:所有小于int的整数类型(比如ushort、byte、short)在参与算术运算时,都会被隐式提升为int类型。所以longitudTrama、HEADER_LENGTH、CHECKSUM_LENGTH这三个ushort变量,都会先被转成int再相加,最终的运算结果是int类型。

而int转ushort属于"窄化转换"(可能会丢失数据),C#不允许这种隐式转换,必须手动加(ushort)强制转换,所以编译器会提示错误。

内容的提问来源于stack exchange,提问作者Alce

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:52:06