//代码一


一个具有隐式类型的局部变量声明中的局部变量声明器(Declarator)必须遵循下列约束:
1. 该声明器必须包含初始化器。
2. 初始化器必须是一个表达式。该初始化器不能是它自己的对象或集合初始化器(第4部分),但可以是一个包含了 对象或集合初始化器的new表达式。
3. 初始化器表达式在编译期的类型必须不能为空类型。
4. 如果局部变量的声明包含多个声明器,所有的初始化器在编译期都必须具有相同的类型。
下面是不正确的具有隐式类型的局部变量声明示例:
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的元素类型。