原文:《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 i = 5;
string s = "Hello";
double d = 1.0;
int[] numbers = new int[] {1, 2, 3};
Dictionary
一个具有隐式类型的局部变量声明中的局部变量声明器(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的元素类型。