C#教程:匿名类型和隐式类型变量的区别

隐式类型变量 (Implicitly typed local variables)

象下面的代码书写就是隐式类型变量

var i = 5;
var str = “Csharp”
var numbers = new int[]{1,2,3};
var orders = new System.Collections.Hashtable();
var orders1 = new Dictionary();

var i = xxx ; 的作用就是用 xxx 的类型声明为i的类型。并给i 赋值。

由于声明时候,需要依赖于等号右边的表达式,所以必须同时赋值。否则下面的书写就会报错误: Error Implicitly typed locals must be initialized

var gg;

使用 Implicitly typed local variables 时应遵守下列约束:

1. The declarator must include an initializer

声明时必须包含初始化器。

2、The initializer must be an expression. The initializer cannot be an object or collection initializer by itself, but it can be a new expression that includes an object or collection initializer.

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

3、The compile-time type of the initializer expression cannot be the null type.

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

比如:

var gg = null; 这行代码就会报错误: Cannot assign '' to an implicitly typed local

4、If the local variable declaration includes multiple declarators, the initializers must all have the same compile-time type.

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

比如如下代码:

var n = "java"
var m = 4;
var ff = m + n;

Console.WriteLine(ff);
Console.WriteLine(ff.GetType());

打印出来的信息会是:

4java
System.String

5. The initializer cannot refer to itself. (初始化中不能提起它自身)

隐式类型变量的使用范围,它可不是到处能用。仅仅可以用于下面四种情况

1. 局部变量声明

2. for 语句中变量声明)

3. using 语句初始化变量时.

4. foreach 中iterator类型声明)

比如下面代码就会报错:

class Program
{
private var tmp = "java"
}
The contextual keyword 'var' may only appear within a local variable declaration

 

隐式类型变量实际是编译器干的活(编译器局部变量的类型从初始化它们的表达式推导而来),所以

var i = 5; 这样的代码,编译后用 Reflector 再反编译看到的是:

int i = 5;

匿名类型(Anonymous Types)

匿名类型,是从对象初始化器自动推导和创建的元组(tuple)类型。

var o = new {Name = "Hello", Age = 23 };
var intArr = new[] {3,1,4,1,5} ;

就是 匿名类型的一种书写。

注意:

var intArr = new[] {3,1,4,1,5} ;  是匿名类型,当然也是 隐式类型变量

var intArr = new int[] {3,1,4,1,5} ;  是隐式类型变量

匿名类型 和 隐式类型变量 的区别

隐式类型变量 指我们可以通过等号右边的表达式,推断出等号左边该是那种类型。

匿名类型则是指,根据这个类型的初始化函数,我们可以推导出和创建出这个类型的实例。

这两个特性很多时候是一起作用的。

比如: new {Name = "Hello", Age = 23 }这个表达式的类型是匿名的,因此o就会变成那个匿名类型。

其中的 Name = "Hello" 又可以看作是 隐式类型变量。

不过应该没有人会用var i = 10;这样看起来像jscript的语法,所以var基本上就是为匿名类型而生 .

说明:

以上信息都是基于 Orcas Beta 1 的。也许正式版的时候,会发生变化。

时间: 2024-12-22 14:33:39

C#教程:匿名类型和隐式类型变量的区别的相关文章

java-无法将类型“int”隐式转换为“byte”。

问题描述 无法将类型"int"隐式转换为"byte". byte a = 1; byte b = 2; byte c = 3; a = b + c; 为什么最下面b,c变成int型了呢= = 解决方案 byte 表示一个字节,他的表示范围[-128 127], byte a = 1; byte b = 2; byte c = 3; 都在这个范围之内,没有问题. 这里还有一个问题 就是我们写的整数,没有明确指出类型(比如说 byte b = 2;中的2) 系统默认是i

C# 泛型 无法将类型xx隐式转换为“T”

原文:C# 泛型 无法将类型xx隐式转换为"T" 直接奖泛型转为T是不能转换的 要先转Object 例:  public static T GetValue<T>(string inValue) { if (typeof(T) == typeof(Bitmap)) { return (T)(Object)new Bitmap(inValue); } else { //一般类型 return (T)Convert.ChangeType(inValue, typeof(T));

asp.net C# 3.0 新特性 学习(二):匿名类型、扩展方法

这两天看了一下msdnwebcast上的visual studio 2008的系列课程,记录下所学的知识,以便加深记忆 1.匿名类型 顾名思义 匿名类型就是没有名字的类型.在C#3.0中允许我们在程序中声明一个临时的类型来存储数据,例如:    代码如下 复制代码 class Program      {          static void Main(string[] args)          {              //声明一个匿名对象,拥有 Name和Age 属性      

C#超级实用的一种类型—匿名类型

顾名思义 匿名类型就是没有名字的类型.当一个新的匿名对象定义与前面已经存在的类型定义的内部变量类型相同时,编译器就会只生成一个类定义,而不是各一个.匿名类型对象中仍然可以再包含匿名对象. 在C#3.0中允许我们在程序中声明一个临时的类型来存储数据,例如: class Program { static void Main(string[] args) { //声明一个匿名对象,拥有 Name和Age 属性 var obj = new { Name = "Joey", Age = 25 }

C#的隐式数值转换

隐式数值转换包括以下几种: ●从sbyte类型到short,int,long,float,double,或decimal类型. ●从byte类型到short,ushort,int,uint,long,ulong,float,double,或decimal类型. ●从short类型到int,long,float,double,或decimal类型. ●从ushort类型到int,uint,long,ulong,float,double,或decimal类型. ●从int类型到long,float,

UVa 10603:Fill,经典倒水问题+隐式图搜索+dfs

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=110&page=show_problem&problem=1544 类型: 隐式图搜索 原题: There are three jugs with a volume of a, b and c liters. (a, b, and c are positive integers not greater th

Scalaz(1)- 基础篇:隐式转换解析策略-Implicit resolution

  在正式进入scalaz讨论前我们需要理顺一些基础的scalaz结构组成概念和技巧.scalaz是由即兴多态(ad-hoc polymorphism)类型(typeclass)组成.scalaz typeclass在scala中的应用有赖于scala compiler的一项特别功能:隐式转换(implicit conversion),使程序表述更精简.由于隐式转换是一项compiler功能,在程序编译(compile)的时候是由compiler来进行类型转换代码的产生和替代的.   让我们先了

JavaScript运算符规则与隐式类型转换详解

本文中涉及的参考资料全部声明在了JavaScript 数据结构学习与实践资料索引 . 隐式类型转换 在 JavaScript 中,当我们进行比较操作或者加减乘除四则运算操作时,常常会触发 JavaScript 的隐式类型转换机制;而这部分也往往是令人迷惑的地方.譬如浏览器中的 console.log 操作常常会将任何值都转化为字符串然后展示,而数学运算则会首先将值转化为数值类型(除了 Date 类型对象)然后进行操作. 我们首先来看几组典型的 JavaScript 中运算符操作结果,希望阅读完本

JavaScript隐式类型转换_javascript技巧

JavaScript的数据类型是非常弱的(不然不会叫它做弱类型语言了)!在使用算术运算符时,运算符两边的数据类型可以是任意的,比如,一个字符串可以和数字相加.之所以不同的数据类型之间可以做运算,是因为JavaScript引擎在运算之前会悄悄的把他们进行了隐式类型转换的,如下是数值类型和布尔类型的相加: 复制代码 代码如下: 3 + true; // 4 结果是一个数值型!如果是在C或者Java环境的话,上面的运算肯定会因为运算符两边的数据类型不一致而导致报错的!但是,在JavaScript中,只