为什么在对除int以外的整数类型进行数学运算时,C#会抛出转换错误?

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
    }
}

这会导致以下编译错误,value1 + value2以红色下划线:

Cannot implicitly convert type 'int'
to 'ushort'. An explicit conversion
exists (are you missing a cast)?

为什么?


与C和C++一样,当与许多运算符一起使用时,整数被隐式地加宽。在这种情况下,将两个ushort值相加的结果是int

更新:

更多信息: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中可用的加法运算符只考虑intuintlongulong数据类型,因此在这种情况下,您将隐式地将两个ushort实例强制转换为int,然后执行加法,然后返回不能隐式转换为ushortint

从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.

这就解释了为什么这种表达会导致int


这是因为UShort的加减不一定会导致UShort。例如,结果可能小于0,这不是ushort。所以您需要给编译器一个提示,让它不要通过类型转换来抱怨。我认为这应该有效:返回(ushort)(value1+value2);