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

Rob*_*vey 5 c# casting compiler-errors

考虑这个静态测试类:

public static class Test
{
    public static ushort sum(ushort value1, ushort value2)
    {
        return value1 + value2
    }
}
Run Code Online (Sandbox Code Playgroud)

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

无法将类型'int'隐式转换为'ushort'.存在显式转换(您是否错过了演员表)?

为什么?

Ste*_*ary 7

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

更新:

更多信息:http://msdn.microsoft.com/en-us/library/aa691330(v = VS.71).aspx

我相信这最初是在C/C++中添加的,因为它int是一个本机整数类型(是的,操作在ints上比short在32位体系结构上更快).我不确定C#的完整原理.

它确实会让你在投射时考虑溢出/截断注意事项.较小的整数类型更可能发生意外溢出.

  • 那个,机器隐含地算术为'int'.此外,如果存在大量隐式转换,编译器将更有可能选择您并不真正想要的转换.(例如,参见PL/I.) (2认同)

Yur*_*ich 5

USHORT

以下赋值语句将产生编译错误,因为赋值运算符右侧的算术表达式默认情况下计算为int.

ushort z = x + y;   // Error: conversion from int to ushort
Run Code Online (Sandbox Code Playgroud)

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

ushort z = (ushort)(x + y);   // OK: explicit conversion
Run Code Online (Sandbox Code Playgroud)