據Marek Safar稱通過使用一種名為類型推斷(type inference)的技術Mono上的C# 編譯器現在已經能夠支持隱式類型的局部變量以及隱式類型的數組了
在類C的語言比如C#中我們經常使用類似type variable = new type這樣略顯冗余的辦法來創建一個對象若是變量的類型名稱較長或是會經常變化那麼這樣的聲明方法更是將顯得非常乏味
借助於最新引入的var關鍵字C# 大大減小了這類冗余通過這樣的聲明方式開發者即可在得到動態創建類型便利的同時也無須犧牲原有的靜態類型支持編譯器將通過等號右面的類型信息來確定變量的實際類型
需要注意的一點是C#仍舊是早期綁定和靜態類型的類似Visual Basic這類延遲綁定(late binding)語言中的一些常見問題(比如由拼寫錯誤造成的missing method exception)並不會在C#中出現
雖然看上去不錯不過添加類型推斷卻不只是為了提高開發者的那麼一點點輸入速度類型推斷是實現匿名類的一個必要的前提條件而匿名類則在LINQ中被廣 泛使用因為匿名類並沒有一個指定的類型名稱所以若是沒有了類型推斷的支持我們就無法在C#中創建該類型的實例(VB則是通過延遲綁定來實現的這個 功能不過這也帶來了missing method exception之類的問題)
C#中支持兩種類型推斷隱式類型變量和隱式類型數組二者的實現基礎完全相同即在編譯時將var替換成為分析得到的正確的變量或數組類型表達式
若是變量的聲明和賦值不在同一行書寫的話編譯器將不允許我們使用類型推斷雖然從技術角度上考慮實現這個功能沒有什麼困難不過C#編譯器的開發團隊可能是為了避免其帶來的復雜性所以並沒有考慮支持這個功能
Marek Safar還提到了兩個無法應用類型推斷的場景
故名思意隱式類型局部變量將無法用於域變量或常量的聲明中否則將導致編譯錯誤
我無法確定為什麼會設置這樣的限制或許我有些地方考慮得也不夠全面
注意從技術角度考慮匿名類也擁有類型名稱該類型名稱是由編譯器自動生成的不過匿名類的名稱卻無法預料因此我們只需要考慮其實現細節換句話說我們最好將匿名類的名稱當作根本不存在
From:http://tw.wingwit.com/Article/program/net/201311/15215.html