這將編譯爲什麼編譯器不能推斷大數很長?
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