2010-07-21 74 views
3

这将编译为什么编译器不能推断大数很长?

var fourGb = (long)4*1024*1024*1024; 

但这种失败

var fourGb = 4*1024*1024*1024; 

随着 “操作溢出在检查模式编译时”。

所以如果编译器知道这将是一个溢出,为什么不能推断变量类型应该是一个很长的?

+1

因为编译器还是比较笨,这是一个边缘情况?一个更好的问题是为什么不完全限定产生“long fourGb”的类型。 'var'只有一个字母缩短了,在这种情况下没有提供可预见的好处 – Earlz 2010-07-21 04:46:23

+4

那么它也可能是ulong?你希望编译器如何明确这一点,而不是明确表示它?此外,int * int将返回一个int,因此最终值将溢出。不是吗? – shahkalpesh 2010-07-21 04:50:12

回答

2

想象一下会引起的骚动。 “但是编译器可以计算出一个表达式应该被评估为很长时间,为什么运行时不能这样做?”

而那不会发生,方式太贵了。

编译器以与运行时相同的方式评估表达式至关重要。如果情况并非如此,编辑常量表达式并用变量替换常量可能会突然导致运行时失败。很难诊断故障,默认情况下,非常量表达式未被选中。

2

我不认为这是通过将计算结果来推断变量的类型是一个好主意。