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

时间:2010-07-21 17:40:19

标签: c# casting compiler-errors

考虑这个静态测试类:

public static class Test
{
    public static ushort sum(ushort value1, ushort value2)
    {
        return value1 + value2
    }
}

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

  

无法隐式转换类型'int'   'ushort'。显式转换   存在(你错过了演员表)吗?

为什么?

4 个答案:

答案 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)

ushort

  

以下作业声明   会产生编译错误,   因为算术表达式   作业的右侧   operator默认情况下计算为int。

ushort z = x + y;   // Error: conversion from int to ushort
  

要解决此问题,请使用强制转换:

ushort z = (ushort)(x + y);   // OK: explicit conversion

答案 2 :(得分:2)

C#中的可用加法运算符仅考虑intuintlongulong数据类型,因此在这种情况下,您隐式地转换了两个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);