而不是错误,为什么编译器不会促使两个文字输入long?

use*_*769 3 c#

以下两个语句将导致编译器溢出错误(原因是默认情况下检查常量表达式是否溢出):

int i=(int)(int.MaxValue+100); // error
long l=(long)(int.MaxValue+100); // error
Run Code Online (Sandbox Code Playgroud)

但是,如果编译器能够弄清楚,添加两个值导致溢出,为什么没有那么促进双方int.MaxValue100long,然后才尝试将其加在一起?据我所知,这应该不是问题,因为根据以下引用,整数文字也可以是类型long:

当整数文字没有后缀时,它的类型是这些类型中的第一个,其值可以表示为:int,uint,long,ulong.

感谢名单

Bol*_*ock 10

文字100可以表示为a int,这是这四种类型中的第一种,所以它是一个int.

int.MaxValue不是文字.它是类型的公共常量字段int.

因此,添加操作会int + int导致a int,然后在这种情况下溢出.

要将文字100转换为a,long以便执行长整数加法,请将其后缀为L:

long l = int.MaxValue + 100L;
Run Code Online (Sandbox Code Playgroud)


Eri*_*ert 7

规则是:

  • int + int是int,不长
  • 算术常量的默认值是"选中"; 算术对非常量的默认值是"未选中"
  • 100和int.MaxValue是常量

因此,根据规范的正确行为是在编译时进行溢出检查并给出错误.

如果相反你说:

int x = 100;
int y = int.MaxValue;
long z = x + y;
Run Code Online (Sandbox Code Playgroud)

然后正确的行为是做一个未经检查的两个整数的加法,在溢出时回绕,然后将得到的整数转换为long.

如果您想要的是长算术,那么您必须这样说.将其中一个操作数转换为long.

  • @ user702769:我是.设计原则很简单.(1)C#是一种静态类型语言,(2)绝大多数整数算术都不在域的边界附近,(3)语言被设计用于识别可能是错误或含糊不清的模式并通知他们的开发人员,而不是试图选择开发人员并做出令人惊讶的错误选择. (4认同)