原文:《C# Version 3.0 Specification》,Microsoft
翻譯:lover_P
在一個具有隱式類型的局部變量聲明(implicitly typed local variable declaration)中,被聲明的局部變量的類型是通過初始化該變量的表達式推斷出來的。當使用局部變量聲指示符符var來代替類型,並且當前作用域內沒有名為var的類型時,這個聲明便成為一個具有隱式類型的局部變量聲明。例如:
var i = 5;
var s = "Hello";
var d = 1.0;
var numbers = new int[] {1, 2, 3};
var orders = new Dictionary<int, Order>();
上面這些具有隱式類型的局部變量聲明和下面這些具有顯式類型的聲明完全一致:
int i = 5;
string s = "Hello";
double d = 1.0;
int[] numbers = new int[] {1, 2, 3};
Dictionary<int, Order> orders = new Dictionary<int, Order>();
一個具有隱式類型的局部變量聲明中的局部變量聲明器(Declarator)必須遵循下列約束:
l 該聲明器必須包含初始化器。
l 初始化器必須是一個表達式。該初始化器不能是它自己的對象或集合初始化器(第4部分),但可以是一個包含了對象或集合初始化器的new表達式。
l 初始化器表達式在編譯期的類型必須不能為空類型。
l 如果局部變量的聲明包含多個聲明器,所有的初始化器在編譯期都必須具有相同的類型。
下面是不正確的具有隱式類型的局部變量聲明示例:
var x; // 錯誤,沒有用來推斷類型的初始化器
var y = {1, 2, 3}; // 錯誤,不允許使用集合初始化器
var z = null; // 錯誤,不允許出現空類型
出於向下兼容的原因,當一個局部變量聲明指示符以var作為類型,但當前作用域中有一個名為var的類型時,這個聲明使用的是該類型;然而,(編譯器)會針對這種模糊的語義給出一個警告。不過由於var違反了類型名字首字母必須大寫這條約定,這種情況應該不大會出現。
for語句的for-initializer和using語句的resource-acquisition可以是一個具有隱式類型的局部變量聲明。同樣,foreach語句中的迭代變量也可以被聲明為具有隱式類型的局部變量,在這種情況下,迭代變量的類型通過待遍歷的集合的元素類型來推斷。
int[] numbers = {1, 3, 5, 7, 9};
foreach(var n in numbers) Console.WriteLine(n);
在上面的例子中n的類型被推斷為int——numbers的元素類型。