2012-09-13 39 views
3

爲什麼var a = 7;會將a類型設置爲某種類型(即int而不是byte)? C#編譯器是否有任何規則/默認/檢查?爲什麼「var」關鍵字設置爲某種類型?

+1

這就是所謂的[類型推斷(http://en.wikipedia.org/wiki/Type_inference).. [MSDN涵蓋它完美地..](http://msdn.microsoft.com/en-us/library /bb384061.aspx)。 –

+1

我認爲他部分想知道爲什麼'var a = 7'沒有聲明一個字節......這是因爲C#編譯器將7看作一個int。 –

+0

@DaveZych準確地說,你有我:) –

回答

14

目前尚不清楚「即時」的含義 - 但C#編譯器只是遵循規範中規定的規則。對於此類聲明:

var a = expression; 

a類型是expression類型。表達7int類型的,儘管它也已知是一個恆定的byte的範圍內,允許:

byte a = 7; 

進行編譯。 可用性轉換爲byte雖然不改變表達式7的類型,所以int是C#編譯器用於類型a的類型。

請注意,我建議不要使用這樣的常量使用var。它結束與代碼可以得到相當令人困惑的邊界intuint,long等是爲了幫助匿名類型,也幫助使代碼可讀。當它使代碼減少可讀時,就不要使用它。

+0

我想到了,即'var x = Some_Type',類型將是某種實現'Some_Type'接口的類。我可能是錯的,但這是我自己的簡單邏輯。整個謎語是關於數字的,實際上......感謝讓它更清晰,Jon! –

+0

@AdrianK .:這裏最好的方法不是猜測一種語言是如何工作的 - 而是要閱讀它。就我個人而言,我喜歡使用語言規範來獲得權威的答案,但當然有些書可以減少某些威脅:) –

+0

絕對! :)我試圖在Andrew的Troelsen書中找到有關我自己喜歡閱讀的書的答案,但我沒有。我也沒有得到任何谷歌查詢是有道理的,因爲我不知道英文和我想。 –

0

var並不意味着「在運行時確定類型」,這意味着「使用賦值運算符右側表達式的結果類型確定類型」。這是在編譯時確定的。

1

有默認值,我不能'告訴你所有他們的手。類似於如果你打電話給5/7,它默認爲整數除法。但如果你做5/7.0,那麼它會做定期的劃分。 var只是將類型設置爲指定值的類型,在沒有強制轉換的情況下,它默認爲整數。

0

manual

一個隱式類型的局部變量是強類型的,就好像你 了自己聲明的類型,但是編譯器確定的類型。

and

var關鍵字指示編譯器從表達式推斷 變量的類型上初始化 語句的右側。

簡單而言,編譯器會檢查分配給該變量的數據的最低可用類型,並強制將該變量鍵入該數據類型。

0

var關鍵字自動將賦值賦給編譯器可以轉換的類型。例如:var s =「」;包含一個字符串,並將被作爲一個字符串。

-2

它設置一個表達式類型,因爲var是一個普通型和自CLR處理內存管理,你需要和將決定表達的類型,使變量那種類型。

+4

var'根本不是一種類型,CLR的內存管理與此完全無關。 'var'是一種要求C#編譯器*推斷*類型的方法。這不是CLR決定的類型 - 它是編譯器。 –

2

的編譯器會將任何整數代碼中的文字,也沒有一個後綴,作爲int

所以這個:

byte myByte = 255; 

..是真正隱式轉換int常數255,一個字節。

那就是爲什麼var被infered爲整數..因爲編譯器默認使用整數常量。

如果你做到這一點:

var a = 7L; 

一個是long類型。

相關問題