C#3.0之隐含类型局部变量

来源:互联网 发布:淘宝为啥登不上去 编辑:程序博客网 时间:2024/05/16 18:50

我们知道语言大概可以分为两大类:强类型语言,譬如C#,JAVA,C等和弱类型语言,譬如javascript

强类型语言每个变量必须有明确的类型,如int,double等,而弱类型语言则没有这样的要求,譬如JS中的类型都可以是var。微软在C#3.0中引入的一个新的关键字"var",可以代表任何类型,但是请不要认为C#在往弱类型化发展,这里的"var"和JS中的"var"有本质区别的。下面先看几个例子

 

var i = 5;
var h
=23.56;
var s 
= “C Sharp";
var intArr = new[] {1,2,3,4} ;
var a 
= new[] 1101001000 };// int[]

 

我们可以清晰的看到"var"可以修饰各种类型的变量,譬如int,string等。为什么这里可以用"var"呢?很简单编译器在编译的时候可以推断出"var"的具体类型。微软在什么情况下可以使用"var"定义了好多规则,详细情况可以参考C#3.0规范。其实概括成一句话就是编译器可以推断出来什么类型那么你就可以使用"var"修饰这个变量。我们可以把"var"理解成占位符,编译器在编译之后会把他换成具体的类型。这里还要区别一下和VB里面的"variant"。和C#里面的"var"也是有着本质区别的。C#里面"var"定义的变量类型是不能改变的。而"variant"定义的变量类型却是可以改变的。下面举个例子

 

var i=2;
i
="123"
//我们看到会出现这样的错误提示
//Error    1    Cannot implicitly convert type 'string' to 'int'

 

下面在看一下什么情况不能使用"var"

 

var y;    //y没有初始化,所以编译器不能推断出具体类型

var q
=null;
/*q初始化为null,而null可以代表任何类型,譬如字符串可以用null初始化,对象可以用null初始化,自然编译器也不能
推断出具体类型
*/


var z
={1,2,3};
/*这里有一条规则是这样的:初始化器必须是一个表达式。初始化器不能是一个自身的对象或者集合初始化器,但是它可以是包含一个对象或集合初始化器的一个new表达式,根据这个规则所以这个也不行。*/

var n
=new[] {1,"hello",3}
/*这里我们看到集合里面的元素类型不唯一,所以编译器不能推断出具体类型。也会出错

 

最后我们看一"var"和"object"

 

object obj = "hi";  // obj5 references the string "hi!", but type is object
var    obj1 = obj;  // obj6 also references "hi!", with inferred type object
string s1 = obj1.ToUpper();  // ERROR: 'object' does not contain 'ToUpper'
/*编译器在推断这个obj1的时候会把"var“替换成"object"类型,也就是说编译器还没有聪明到从obj推断出是个string变量
然后在把”var“替换成string,所以在调用obj1.ToUpper()时会出错

 

下面我把C#3.0规范里面的一些规则列出来,供大家参考

·         声明符必须包含初始化器。

·         初始化器必须是一个表达式。初始化器不能是一个自身的对象或者集合初始化器,但是它可以是包含一个对象或集合初始化器的一个new表达式。

·         初始化器表达式的编译期类型不可以是空(null)类型。

·         如果局部变量声明包含了多个声明符,这些声明符必须具备同样的编译期类型。

 

原创粉丝点击