介紹Mono C#編譯器
據(jù)Marek Safar稱,通過使用一種名為類型推斷(type inference)的技術(shù),Mono C#編譯器現(xiàn)在已經(jīng)能夠支持隱式類型的局部變量以及隱式類型的數(shù)組了。
在“類C”的語言,比如C#中,我們經(jīng)常使用類似“type variable = new type”這樣略顯冗余的辦法來創(chuàng)建一個對象。若是變量的類型名稱較長,或是會經(jīng)常變化,那么這樣的聲明方法更是將顯得非常乏味。
借助于***引入的“var”關(guān)鍵字,C# 3.0大大減小了這類冗余。通過這樣的聲明方式,開發(fā)者即可在得到動態(tài)創(chuàng)建類型便利的同時,也無須犧牲原有的靜態(tài)類型支持。編譯器將通過等號右面的類型信息來確定變量的實(shí)際類型。
需要注意的一點(diǎn)是,C#仍舊是早期綁定和靜態(tài)類型的。類似Visual Basic這類延遲綁定(late binding)語言中的一些常見問題(比如由拼寫錯誤造成的“missing method exception”)并不會在C#中出現(xiàn)。
雖然看上去不錯,不過添加類型推斷卻不只是為了提高開發(fā)者的那么一點(diǎn)點(diǎn)輸入速度。類型推斷是實(shí)現(xiàn)匿名類的一個必要的前提條件,而匿名類則在LINQ中被廣 泛使用。因?yàn)槟涿惒]有一個指定的類型名稱,所以若是沒有了類型推斷的支持,我們就無法在C#中創(chuàng)建該類型的實(shí)例。(VB則是通過延遲綁定來實(shí)現(xiàn)的這個 功能,不過這也帶來了“missing method exception”之類的問題。)
C#中支持兩種類型推斷:隱式類型變量和隱式類型數(shù)組。二者的實(shí)現(xiàn)基礎(chǔ)完全相同,即在編譯時將“var”替換成為分析得到的正確的變量或數(shù)組類型表達(dá)式。
若是變量的聲明和賦值不在同一行書寫的話,編譯器將不允許我們使用類型推斷。雖然從技術(shù)角度上考慮,實(shí)現(xiàn)這個功能沒有什么困難,不過Mono C#編譯器的開發(fā)團(tuán)隊(duì)可能是為了避免其帶來的復(fù)雜性,所以并沒有考慮支持這個功能。
Marek Safar還提到了兩個無法應(yīng)用類型推斷的場景。
故名思意,“隱式類型局部變量”將無法用于域變量或常量的聲明中,否則將導(dǎo)致編譯錯誤。
我無法確定為什么會設(shè)置這樣的限制,或許我有些地方考慮得也不夠全面。
注意:從技術(shù)角度考慮,匿名類也擁有類型名稱,該類型名稱是由Mono C#編譯器自動生成的。不過匿名類的名稱卻無法預(yù)料,因此我們只需要考慮其實(shí)現(xiàn)細(xì)節(jié)。換句話說,我們***將匿名類的名稱當(dāng)作根本不存在。
【編輯推薦】