Why does C# throw casting errors when attempting math operations on integer types other than int?
考虑这个静态测试类:
1 2 3 4 5 6 7 | public static class Test { public static ushort sum(ushort value1, ushort value2) { return value1 + value2 } } |
这会导致以下编译错误,
Cannot implicitly convert type 'int'
to 'ushort'. An explicit conversion
exists (are you missing a cast)?
为什么?
与C和C++一样,当与许多运算符一起使用时,整数被隐式地加宽。在这种情况下,将两个
更新:
更多信息:http://msdn.microsoft.com/en-us/library/aa691330(v=vs.71).aspx
我相信这最初是在C/C++中添加的,因为EDCOX1〔1〕是一个本机整数类型(是的,在EDCOX1,1,s上的操作比在32位架构上的EDCOX1 4)快得多。我不确定C的全部理由。
它确实会让您在进行强制转换时考虑溢出/截断的注意事项。对于较小的整数类型,意外溢出的可能性更大。
无符号短整数
The following assignment statement
will produce a compilation error,
because the arithmetic expression on
the right-hand side of the assignment
operator evaluates to int by default.
1 | ushort z = x + y; // Error: conversion from int to ushort |
To fix this problem, use a cast:
1 | ushort z = (ushort)(x + y); // OK: explicit conversion |
C中可用的加法运算符只考虑
从C 4.0规范第7.8.4节"加法运算符"中,可以检查是否只有以下整数加法运算符可用:
1 2 3 4 | int operator +(int x, int y); uint operator +(uint x, uint y); long operator +(long x, long y); ulong operator +(ulong x, ulong y); |
同一节还说明:
The operands are converted to the
parameter types of the selected
operator, and the type of the result
is the return type of the operator.
这就解释了为什么这种表达会导致
这是因为UShort的加减不一定会导致UShort。例如,结果可能小于0,这不是ushort。所以您需要给编译器一个提示,让它不要通过类型转换来抱怨。我认为这应该有效:返回(ushort)(value1+value2);