类型推断与 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 的varJS 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: 嵌套代码块和作用域