C# 3.0语言新特性之推断类型

 //代码一

var i = 2008;
var s = "ACCP";
var d = 5.0;
var numbers = new int[] {1, 2, 3};
var students = new Dictionary<int, Person>();
 
//代码二 
int i = 2008;
string s = "ACCP";
double d = 5.0;
int[] numbers = new int[] {1, 2, 3};
Dictionary<int, Person > students =
new Dictionary<int, Person >();
 
 
我们注意到,在反汇编后,两者的代码完全一样。
 
和自动属性类似,编译器帮助我们完成了幕后工作。
 

一个具有隐式类型的局部变量声明中的局部变量声明器(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的元素类型。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值