C#語言(以及其他語言,我確定)需要數字文本末尾的後綴。這些後綴表示文字的類型。例如,5m
是一個小數,5f
是一個浮點數。爲什麼需要數字後綴?
我的問題是:這些後綴是否真的有必要,還是有可能從它的上下文中推斷出文字的類型?
例如,代碼decimal d = 5.0
應該推斷5.0
不是雙精度,而是小數。這種語法是否會導致問題?
C#語言(以及其他語言,我確定)需要數字文本末尾的後綴。這些後綴表示文字的類型。例如,5m
是一個小數,5f
是一個浮點數。爲什麼需要數字後綴?
我的問題是:這些後綴是否真的有必要,還是有可能從它的上下文中推斷出文字的類型?
例如,代碼decimal d = 5.0
應該推斷5.0
不是雙精度,而是小數。這種語法是否會導致問題?
這對簡單的場合,如:
float f = 7;
,但它遠不如做個明確的,這樣你就不用擔心類似的語句:
float f = (double)(int)(1/3 + 6e22/(double)7);
是的,我知道這是一個人爲的例子,但我們不知道只知道左側的編碼器的意圖,特別是如果它根本沒有被賦予一個變量(例如作爲參數傳遞給重載函數可以採用int,float,double,decimal等其中之一)。
一般來說,我們嘗試設計語言,以使有關類型的信息流出「out」,而不是「in」。也就是說,表達式的類型是通過首先分析它的每個子表達式來確定的,然後我們看看它是否與它的上下文一致 - 我們通常不會採用其他方式,從上下文推理到子表達式。當類型信息可以雙向流動時,您可以進入一些非常難以分析的情況,就像使用lambda表達式一樣。
現在,在你提到的具體情況,我們可以寫了一個規則說「浮點文字可轉換無精度或幅度不要求m後綴損失爲十進制」,正如字面適合自動縮短轉換的整數。但是添加「m」很容易,如果某些文字自動轉換而其他文字不轉換,並且要求這些類型保持一致,會使代碼更易於理解和更自我記錄,這會很混亂。