为何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
相关产品推荐
相关产品推荐

