型別推斷與 var 關鍵字
觀察下方程式碼,變數開頭宣告的型別,編譯器完全能夠透過等號右側的初始值自動推導出來。舉例來說,下方的 18 是否可以推斷為整數 int,Phone() 能不能推導成 Phone 型別?
static void Main( )
{
int age = 18; // 右側的18可直接推斷為int
Phone p = new Phone(); // 右側建構子回傳Phone物件
}
Code language: C# (cs)
那麼上面這段程式碼,是否還有簡化的空間?
C# 提供 var 關鍵字簡化寫法,用來取代明確指定型別。
static void Main( )
{
var age = 18;
var p = new Phone();
}
Code language: JavaScript (javascript)
這段程式左邊的變數型別全部使用 var,編譯器會依據右側內容推斷左側型別,編譯完成之後,前後兩份程式碼執行效果完全相同。

注意事項
var並非動態型別,只屬於語法簡寫;編譯器會在編譯階段鎖定推導出來的型別,後續無法更改;兩段程式語義完全相等。- 使用
var的強制規範:- 僅限使用在區域變數,不可用於類別的欄位
- 宣告時一定要給初始值,不能只寫
var x; - 推導得到的型別固定,變數之後不能存放其他型別資料
- 重要區分:C# 的
var≠ JavaScript 的var。JS 的 var 屬於動態弱型別,變數可隨時切換存放不同型別;C# var 只是靜態強型別的簡寫,不會改變 C# 為強型別語言的特性。
也就是說上面的 var,在編譯時,編譯器會依右側內容推論,把 age 的型別轉為 int,p 轉為 Phone,最終與第一段程式碼沒有差異。
之後不能修改它們的型別。舉例如下:

class Program
{
static void Main()
{
var age = 18;
age = 3.14;
var p = new Phone();
}
}
class Phone
{
public string Name { get; set; }
}Code language: C# (cs)
上面這種寫法在 C# 中是錯誤的,但 JavaScript、PHP 等其他語言允許,它們容許變數隨意更換型別。
JS 與 PHP 屬於 弱型別、動態型別語言,變數本身沒有固定的型別限制。

錯誤範例
class Program
{
static void Main()
{
var age = 18;
age = 3.14;
var p = new Phone();
var isBuy;
}
}
class Phone
{
var price = 1000;
var model = "iPhone";
int count = 12;
}Code language: C# (cs)
型別推斷
Previous: 方法(Method)
Next: 巢狀程式碼區塊與作用域