var 是 C# 3.0 引入的語法糖,讓編譯器根據初始化運算式自動推斷區域變數型別。它不是動態型別、Variant 或晚期繫結——推斷結果在編譯期確定,生成的 IL 與顯式宣告型別完全相同。
var i = 5; // int
var d = 9.0; // double
var s = "Hello"; // string
var arr = new[] { 1, 2, 3 }; // int[]
var anon = new { Name = "Terry", Age = 34 }; // 匿名類型
var list = new List<int>(); // List<int>
var query = from c in customers where c.City == "London" select c; // IEnumerable<Customer>
| 限制 | 說明 | 錯誤範例 | 錯誤訊息 |
|---|---|---|---|
| 必須初始化 | 宣告時必須指派值,編譯器才能推斷型別 | var x; x = 10; | 隱式型別區域變數必須已初始化 |
| 不可為 null | null 無型別資訊,無法推斷 | var x = null; | 無法將 <null> 指派給隱式型別區域變數 |
| 僅限區域變數 | 不可用於欄位、屬性、方法參數、回傳型別 | class C { var f = 1; } | "var" 關鍵字只能出現在區域變數宣告中 |
| 初始化器必為運算式 | 不可為物件/集合初始化器單獨存在(但可為包含它們的 new 運算式) | var x = { A = 1 }; | 無法從初始化器推斷型別 |
| 強型別不可變 | 推斷完成後型別固定,不可指派不相容值 | var x = 10; x = "abc"; | 無法將型別 'string' 隱式轉換為 'int' |
new[] 語法讓陣列型別同樣由元素推斷:
var a = new[] { 1, 10, 100 }; // int[]
var b = new[] { "hello", "world" }; // string[]
var c = new[] { new[]{1,2}, new[]{3,4} }; // int[][]
var d = new[] { "Luca", 123 }; // 編譯錯誤:元素型別不相容
所有元素必須隱式可轉換至單一共同型別。
var 可用於:
for 迴圈初始化:for (var i = 0; i < 10; i++)foreach 迴圈:foreach (var item in list)using 陳述式:using (var fs = File.OpenRead(...))var 減少冗餘:var list = new List<string>();varvar dict = new Dictionary<string, List<int>>();var result = DoSomething();(維護者需查閱方法簽章)var x = 10; 不如 int x = 10; 明確團隊應建立一致的編碼風格規範,平衡簡潔與可讀性。