考虑这个静态测试类:
public static class Test
{
public static ushort sum(ushort value1, ushort value2)
{
return value1 + value2
}
}
这导致以下编译错误,value1 + value2
以红色下划线标出:
无法隐式转换类型'int' 'ushort'。显式转换 存在(你错过了演员表)吗?
为什么?
答案 0 :(得分:7)
与之前的C和C ++一样,当与许多运算符一起使用时,整数会被隐式加宽。在这种情况下,将两个ushort
值相加的结果为int
。
<强>更新强>
更多信息:http://msdn.microsoft.com/en-us/library/aa691330(v=VS.71).aspx
我认为这最初是在C / C ++中添加的,因为int
是一个原生整数类型(是的,int
上的操作比32位上short
上的操作更快体系结构)。我不确定C#的完整原理。
它确实会让你考虑转换时的溢出/截断注意事项。对于较小的整数类型,更有可能出现意外溢出。
答案 1 :(得分:5)
以下作业声明 会产生编译错误, 因为算术表达式 作业的右侧 operator默认情况下计算为int。
ushort z = x + y; // Error: conversion from int to ushort
要解决此问题,请使用强制转换:
ushort z = (ushort)(x + y); // OK: explicit conversion
答案 2 :(得分:2)
C#中的可用加法运算符仅考虑int
,uint
,long
和ulong
数据类型,因此在这种情况下,您隐式地转换了两个ushort
实例到int
,然后执行添加,然后返回无法隐式转换为int
的{{1}}。
从C#4.0规范的 7.8.4 Addition运算符部分,您可以检查是否只有以下整数加法运算符可用:
ushort
同一部分还指出:
操作数转换为 所选参数类型 运算符,以及结果的类型 是运算符的返回类型。
这解释了为什么该表达式导致int operator +(int x, int y);
uint operator +(uint x, uint y);
long operator +(long x, long y);
ulong operator +(ulong x, ulong y);
。
答案 3 :(得分:1)
这是因为ushorts的加法或减法不一定会导致ushort。例如,结果可以是&lt; 0,这不是一个ushort。因此,您需要通过类型转换为编译器提供不抱怨的提示。我相信这应该有效:return(ushort)(value1 + value2);