C#具有隐式类型声明描述

开发 后端
这里介绍C#具有隐式类型声明,在C# 3.0中可以使用新增的关键字var来代替声明中的类型,而由编译器根据初始化表达式来推断出变量的类型。

本文向大家介绍C#具有隐式类型声明,可能好多人还不知道隐式类型声明,没有关系,看完本文你肯定有不少收获,希望本文能教会你更多东西。

C#具有隐式类型声明

在一个带有初始化器的声明语句中,待声明的变量的类型是显而易见的——和初始化表达式的结果类型一致。对于这种情况,在C# 3.0中可以使用新增的关键字var来代替声明中的类型,而由编译器根据初始化表达式来推断出变量的类型。

  1. var i = 5; // int  
  2. var d = 9.0; // double  
  3. var s = "Hello"; // string  
  4. var a = new int[] { 1, 2, 3, 4, 5 }; // int[]  
  5.  
  6. Console.WriteLine("Type of variable <i>: {0}", i.GetType());  
  7. Console.WriteLine("Type of variable <d>: {0}", d.GetType());  
  8. Console.WriteLine("Type of variable <s>: {0}", s.GetType());  
  9. Console.WriteLine("Type of variable <a>: {0}", a.GetType()); 

上面的代码在C# 3.0中是符合语法规则的,前四行代码就是使用了隐式类型的声明;而后四行代码用于在运行时验证各个变量是否拥有正确的类型。如果在Visual Studio 2005中运行这段代码(为了能够看到结果,请使用Ctrl+F5来编译并启动程序),会得到下面的结果:

  1. Type of variable <i>: System.Int32  
  2. Type of variable <d>: System.Double  
  3. Type of variable <s>: System.String  
  4. Type of variable <a>: System.Int32[] 

这表明,编译器在编译的时候,已经正确地推断了每个变量的类型,并将其嵌入到了程序集的元数据中。

这里有两个限制,一是C#具有隐式类型声明只能作用在局部变量上,二是这种声明必须有初始化器(即等号和后面的表达式)。如果我们企图在一个类中声明一个具有隐式类型的域,就会出现一个编译错误:Invalid token ’var’ in class, struct, or interface member declaration;而如果声明中没有出现初始化器,则会导致另外一个编译错误:’=’ expected。

除了局部变量外,作用域为一个块的数组也可以运用C#具有隐式类型声明,例如:

  1. var ia = new [] { 1, 2, 3, 4, 5 }; // int[]  
  2. var da = new [] { 1.1, 2, 3, 4, 5 }; // double[]  
  3. var sa = new [] { "Hello", "World" }; // string[]  
  4.  
  5. Console.WriteLine("Type of array <ia>: {0}", ia.GetType());  
  6. Console.WriteLine("Type of array <da>: {0}", da.GetType());  
  7. Console.WriteLine("Type of array <sa>: {0}", sa.GetType()); 

在上面例子的数组声明中,在运算符new和表示数组声明的一对方括号之间省略了类型名字,但这在C# 3.0中仍然是符合语法规则的。编译器会通过成员列表中的值的类型来推断数组的类型。编译并运行上面的例子,会得到如下的输出:

  1. Type of array <ia>: System.Int32[]  
  2. Type of array <da>: System.Double[]  
  3. Type of array <sa>: System.String[] 

除了和具有隐式类型的局部变量具有相同的约束外,具有隐式类型的数组还有必须尊从这样一个规则,即成员列表中的所有值必须是兼容的。也就是说,成员列表中必须存在这样一个值,使得其他值可以隐式地转换为该值的类型。因此,下面的声明是不符合语法规则的:

  1. var aa = new [] { 1, "Hello", 2.0, "World" }; 

如果试图编译上面的代码,会得到一个编译错误:No array type can be inferred from the initializers。这是因为编译器无法根据成员列表中的值来推断数组的类型。

实际上,尽管C#具有隐式类型声明使得传统声明的编写方法更加便利,然而引入这种声明方式的真正目的并不在于此,而是为了使局部变量和数组能够访问这样一个新的语言构造:匿名类型。

【编辑推荐】

  1. C# System.Xml集合
  2. C#实现Strategy接口
  3. C#编写操作TreeView组件剖析
  4. C#实现IDisposable接口浅析
  5. C#异常处理详细剖析
责任编辑:佚名 来源: 百度空间
相关推荐

2009-08-26 15:39:08

C#隐式类型局部变量

2009-09-01 18:05:17

C#类型声明

2009-09-03 16:55:58

C#引用类型

2009-09-04 10:49:19

C#隐式转换

2023-08-14 08:35:36

2009-08-13 17:04:09

C#语言C#程序

2009-09-04 14:04:53

C#文档

2009-08-03 18:08:39

C# ICloneab

2009-08-18 17:41:22

C# ListView

2009-08-17 16:32:34

C# Anonymou

2009-08-31 18:32:01

C# ListBoxE

2009-08-31 13:18:09

C# IWebMess

2009-08-26 17:49:36

C# readonly

2009-08-20 09:30:03

C#开发WinForm

2009-08-03 16:45:02

C#异步Socket

2009-08-19 10:09:21

C#和C++

2009-09-02 14:18:08

C#声明COM接口

2009-09-16 09:01:40

C#多维数组

2009-08-13 17:58:34

C#存储过程

2009-09-07 14:33:02

C# switch语句
点赞
收藏

51CTO技术栈公众号