这将编译为什么编译器不能推断大数很长?
var fourGb = (long)4*1024*1024*1024;
但这种失败
var fourGb = 4*1024*1024*1024;
随着 “操作溢出在检查模式编译时”。
所以如果编译器知道这将是一个溢出,为什么不能推断变量类型应该是一个很长的?
这将编译为什么编译器不能推断大数很长?
var fourGb = (long)4*1024*1024*1024;
但这种失败
var fourGb = 4*1024*1024*1024;
随着 “操作溢出在检查模式编译时”。
所以如果编译器知道这将是一个溢出,为什么不能推断变量类型应该是一个很长的?
想象一下会引起的骚动。 “但是编译器可以计算出一个表达式应该被评估为很长时间,为什么运行时不能这样做?”
而那不会发生,方式太贵了。
编译器以与运行时相同的方式评估表达式至关重要。如果情况并非如此,编辑常量表达式并用变量替换常量可能会突然导致运行时失败。很难诊断故障,默认情况下,非常量表达式未被选中。
见http://msdn.microsoft.com/en-us/library/ctetwysk%28VS.80%29.aspx
你要求它乘以一堆整数,这样的答案是根据C#语法一个int。如果你想要长时间使用'L'。
var fourGb = 4L * 1024 * 1024 * 1024;
它在大多数语言相同:
任何其他行为将“VAR”数据类型造成意想不到的后果
可以说你已经:
double varname = 1/2
我不认为这是通过将计算结果来推断变量的类型是一个好主意。
因为编译器还是比较笨,这是一个边缘情况?一个更好的问题是为什么不完全限定产生“long fourGb”的类型。 'var'只有一个字母缩短了,在这种情况下没有提供可预见的好处 – Earlz 2010-07-21 04:46:23
那么它也可能是ulong?你希望编译器如何明确这一点,而不是明确表示它?此外,int * int将返回一个int,因此最终值将溢出。不是吗? – shahkalpesh 2010-07-21 04:50:12