C# 3.0新特性系列(1):隐含类型局部变量

一.隐含类型局部变量简介

C#3.0中增加了很多新的语言特性,如果有一个局部变量被声明为var,这个声明被视为隐含类型局部变量声明,然后由编译器根据局部变量初始化表达式来推断变量的类型。如下面的声明:

var integer = 10;

var name = "Terry Lee";

var numbers = new int[] { 1, 2, 3 };

var在这里是仅仅是一个关键字,它并不是C#3.0中的一种新的类型,而是负责告诉编译器,该变量需要根据初始化表达式来推断变量的类型,上面的语句相当于:

int integer = 10;

string name = "Terry Lee";

int[] numbers = new int[] { 1, 2, 3 };

二.需要注意的问题

1.在声明时必须同时赋值,因为声明依赖于赋值号右边的表达式,如果有下面的语句:

var integer;

integer = 10;

编译时会报Implicitly typed locals must be initialized错误。

2.在使用var声明一个局部变量后,它仍然具有强类型,可以做如下测试:

var integer = 10;

integer = "Terry Lee";

编译时会报Cannot implicitly convert type 'string' to 'int'错误。

3. 初始化器表达式的编译期类型不可以是空(null)类型,编译器无法根据null来推断出局部变量的类型,如有下面的语句:

var integer = null;

编译时会报Cannot assign '<null>' to an implicitly typed local错误。

4. 初始化语句必须是一个表达式,初始化表达式不能包含它自身,但是可以是包含一个对象或集合初始化器的一个new表达式(即匿名类型)

如可以这样去声明:

var coll = new Hashtable();

三.适用范围

var的声明仅限于局部变量,也可以包含在foreachforusing语句中。下面的使用是错误的:

class Program

{

    private var i = 10;

    static void Main(string[] args)

    {

        

    }

}

编译时会报The contextual keyword 'var' may only appear within a local variable declaration错误。

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2007-07-11 08:49 TerryLee 阅读(4493) 评论(28)  编辑 收藏 网摘

  回复  引用  查看    
#1楼 2007-07-11 11:29 | Anthan      
这不是和JavaScript学的嘛,有点违背了强类型的原理啊?
  回复  引用  查看    
#2楼 [楼主]2007-07-11 12:47 | TerryLee      
@Anthan
使用var声明后,仍然是强类型的啊
  回复  引用    
#3楼 2007-07-11 12:58 | yangedie [未注册用户]
这几天更新不少哦
  回复  引用  查看    
#4楼 2007-07-11 16:37 | Anthan      
@TerryLee
明白了,没看仔细,呵呵
其实它就是省略了一个类型关键字是吗?
如下定义应该是一样的吧?
int i=2;
var i=2;
  回复  引用  查看    
#5楼 [楼主]2007-07-11 17:05 | TerryLee      
@yangedie
好长时间没有更新,觉得对不住大家,回来忏悔来了,呵呵:)
  回复  引用  查看    
#6楼 [楼主]2007-07-11 17:06 | TerryLee      
@Anthan
没错!
  回复  引用  查看    
#7楼 2007-07-11 18:50 | 暗香浮动      
没什么感觉的一个东西。
  回复  引用    
#8楼 2007-07-11 19:25 | eric.wen [未注册用户]
这有什么好处呢。感觉没有什么好处。!!
  回复  引用  查看    
#9楼 [楼主]2007-07-12 08:37 | TerryLee      
@eric.wen
@暗香浮动
C#3.0里面的几个新特性感觉都是为了LINQ而准备的
  回复  引用  查看    
#10楼 2007-07-12 11:01 | 随风流月      
这是编译时工作,就像 VB9 一样。
  回复  引用    
#11楼 2007-07-12 15:41 | 甜饼旺 [未注册用户]
var str = "1";
var i = "2";
str + i = ?
难道要像javascript一样吗?按string类型转?
  回复  引用    
#12楼 2007-07-12 17:48 | Bird [未注册用户]
是不是说var str只是定义了一个object,其类型要在编译时产生?
  回复  引用  查看    
#13楼 [楼主]2007-07-13 08:24 | TerryLee      
@随风流月
这肯定是编译时工作了
  回复  引用  查看    
#14楼 [楼主]2007-07-13 08:24 | TerryLee      
@甜饼旺
如果类型相同的话,是可以使用+的
  回复  引用  查看    
#15楼 [楼主]2007-07-13 08:25 | TerryLee      
@Bird
var可以理解成一个占位符,在编译时会根据初始化表达式,给他一个类型
  回复  引用  查看    
#16楼 2007-07-17 10:47 | xiao_p      
这东西一般和lamda表达式一起用的
  回复  引用  查看    
#17楼 2007-07-18 11:22 | KiddLee      
哈哈,又开始更新了
  回复  引用    
#18楼 2007-07-18 13:34 | yamunchien [未注册用户]
Terry 写的都是经典啊。
在这里我也发布一条好消息,微软培训给了我很多Sql 2005 资料,都是非常棒的。www.fovly.com
谢谢Terry 的文章,让我们进步很多。
  回复  引用  查看    
#19楼 2007-08-07 16:14 | PointNet      
有点和javascript语法类似
  回复  引用    
#20楼 2007-08-07 18:30 | 监控局域网 [未注册用户]
C#好用还是C++好用啊?
  回复  引用    
#21楼 2007-08-09 14:43 | 夜已醉 [未注册用户]
期望TerryLee可以快些更新这个C#3.0新特性系列。
多谢!

  回复  引用    
#22楼 2007-09-03 03:46 | 幽默短信 [未注册用户]
疯狂学习中。
  回复  引用    
#23楼 2007-09-07 17:50 | zhoucloud [未注册用户]
感觉上没什么用,如果定义时都赋了初值,那就等于知道变量类型了,知道了还要写var干吗?只是为了偷懒吗?
  回复  引用    
#24楼 2007-09-21 23:43 | 下雨 [未注册用户]
C#好用还是C++好用啊?

-------------------------------------------------
http://www.sy555.com
  回复  引用    
#25楼 2007-09-28 21:12 | Maooson [未注册用户]
个人觉得强类型语言不应该弱化应该遵循那些规则,这样反而对程序的造成不便.
  回复  引用    
#26楼 2007-09-28 21:13 | Maooson [未注册用户]
--引用--------------------------------------------------
Maooson: 个人觉得强类型语言不应该弱化应该遵循那些规则,这样反而对程序的理解造成不便.
--------------------------------------------------------
个人觉得强类型语言不应该弱化应该遵循那些规则,这样反而对程序的理解造成不便.
  回复  引用  查看    
#27楼 2007-10-03 23:23 | 随风逝去      
@Maooson
同意!
  回复  引用    
#28楼 2007-10-24 12:53 | hackace [未注册用户]
兄弟,在干嘛呢
怎么3个月都没动静了啊?

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索



相关文章:

相关链接: