C# 3.0语言新特性(语言规范):6 具有隐式类型的数组

规范|数组

原文:《C# Version 3.0 Specification》,Microsoft
翻译:lover_P
数组创建表达式的语法被扩展为支持具有隐式类型的数组创建表达式:

array-creation-expression:
...
new  [  ]  array-initializer

在一个具有隐式类型的数组创建表达式中,数组实例的类型通过数组初始化器中指定的元素来推断。特别地,数组初始化器中的表达式类型形成的集合中,必须恰好有一个类型使得其他类型都可以隐式地转换为该类型,并且该类型不是空类型,则创建一个具有该类型的数组。如果无法推断出恰好一个这样的类型,或者推断出来的类型是空类型,会发生一个编译期错误。

下面是具有隐式类型的数组创建表达式的一些例子:

var a = new[] { 1, 10, 100, 1000 };          // int[]

var b = new[] { 1, 1.5, 2, 2.5 };            // double[]

var c = new[] { "hello", null, "world" };  // string[]

var d = new[] { 1, "one", 2, "two" };       // Error

最后一个表达式会产生一个编译期错误,因为int和string都不能隐式地转换为另一个。这时就必须使用一个具有显式类型的数组创建表达式,例如指定其类型为object[]。另一种可选方法是,某个元素可以被转换为一个通用基本类型,这个类型就将成为推导出的类型。

具有隐式类型的数组创建表达式可以与匿名对象初始化器合并,来创建匿名类型数据结构。例如:

var contacts = new[] {

    new {

        Name = "Chris Smith",

        PhoneNumbers = new[] { "206-555-0101", "425-882-8080" }

    },

    new {

        Name = "Bob Harris",

        PhoneNumbers = new[] { "650-555-0199" }

    }

};

 

时间: 2025-01-30 03:47:56

C# 3.0语言新特性(语言规范):6 具有隐式类型的数组的相关文章

C# 3.0语言新特性(语言规范)

规范 原文:<C# Version 3.0 Specification>,Microsoft翻译:lover_P C# 3.0(C# Orcas--魔鬼)在C# 2.0的基础上引入了很多语言扩展,用以支持高级别的函数式风格类库的创建和使用.这些扩展使得结构性API构造具有与其他领域(如关系数据库和XML)中查询语言同等的表达能力.这些扩展包括: 具有隐式类型的局部变量,允许通过用于初始化的表达式来推断局部变量的类型. 扩展方法,使得对一个现存类型的扩展和构造具有附加方法的类型变为现实. 拉姆达

C# 3.0语言新特性(语言规范):3 拉姆达表达式

规范 原文:<C# Version 3.0 Specification>,Microsoft翻译:lover_P C# 2.0中引入了匿名方法,允许在期望出现委托的时候以"内联(in-line)"的代码替代之.尽管匿名方法提供了函数式编程语言中的很多表达能力,但匿名方法的语法实在是太罗嗦了,并且很不自然.拉姆达表达式(Lambda expressions)为书写匿名方法提供了一种更加简单.更加函数化的语法. 拉姆达表达式的书写方式是一个参数列表后跟=>记号,然后跟一个

C# 3.0语言新特性(语言规范):1 具有隐式类型的局部变量

变量|规范 原文:<C# Version 3.0 Specification>,Microsoft翻译:lover_P 在一个具有隐式类型的局部变量声明(implicitly typed local variable declaration)中,被声明的局部变量的类型是通过初始化该变量的表达式推断出来的.当使用局部变量声指示符符var来代替类型,并且当前作用域内没有名为var的类型时,这个声明便成为一个具有隐式类型的局部变量声明.例如: var i = 5; var s = "Hel

C#3.0语言新特性之隐式类型

20.1 隐式类型 在C#3.0中增加了一个变量声明var,这个声明和JavaScript 的var类似,但 也有不同.相同之处是它可以用var来声明任何类型的局部变量:而不同之处在 于它仅仅负责告诉编译器,该变量需要根据初始化表达式来推断变量的类型,而 且只能是局部变量. 20.1.1 隐式类型局部变量的声明与使用 在C# 3.0中,引进了一个新的关键字叫做var.var允许你声明一个新变量, 它的类型是从用来初始化器变量的表达式里隐式的推断出来的,即在声明时,你 不需要给它定义类型,它会根据

AS代码2.0:新的语言元素

Flash的ActionScript(简称AS)代码控制是Flash实现交互性的重要组成部分,也是区别于其他动画软件的看家本领.今年新发布的Flash MX Professional 2004的动作脚本语言已经升级到2.0,它是一种面向对象的脚本语言,执行ECMA-262脚本语言规范,支持继承.强类型和事件模型.使用动作脚本语言2.0可以编写出更加稳健的脚本. 动作脚本语言2.0的新特性包括:新的语言元素.改进的编辑和调试工具.引入更多.的面向对象编程模型. 本系列文章将向大家详细介绍AS代码2

《Visual C++ 2012 开发权威指南》——第2章 Visual C++2012语言新特性2.1 Visual C++2012的语言新特性(1)

第2章 Visual C++2012语言新特性 Visual C++ 2012 开发权威指南 有一种新的C++标准就有一种新版本的Visual C++,新的版本Visual C++将更加符合C++标准!在其发展过程中新的C++标准被(乐观)称为C++0x.它最后被发布在2011年,现在称为C++11. 对于Visual C++,它有三个不同版本的数字,有不同的内部版本和编译器版本(cl.exe和_MSC_VER宏-显示不同,因为我们C++编译器早在Visual C++中的"可视化").

《Visual C++ 2012 开发权威指南》——2.2 Visual C++2012的语言新特性(2)

2.2 Visual C++2012的语言新特性(2) Rvalue引用:N1610"Rvalues类对象的初始化的澄清"是早期尝试启用无rvalue引用move 语意. 这些新规则还没有完全实现VC11开发者预览中. Rvalue引用v3.0添加自动生成的构造函数和移动赋值运算符在一定条件下的新规则.这不会进行中VC11,还将继续遵循的永远不会自动生成move构造函数/移动页本页的行为. 移动语义 Rvalue引用支持移动语义的实现,可以显著提高应用程序的性能.移动语义使能够调用资源

《Visual C++ 2012 开发权威指南》——2.3 Visual C++2012的语言新特性(3)

2.3 Visual C++2012的语言新特性(3) 在VC12(Visual C++2012),我们打算完全支持C++11标准库,但实施编译器功能可以自定义(另外,VC12不会完全实现C99标准库,已经通过引用纳入C++11标准库.注意本页和VC12已经有).这里是我们不断的变化的非详尽列表: 新头文件:......和. 进驻:根据需要由C++11,我们已经实现了emplace()/emplacefront()/emplace_back()/ emplace hint()/emplace_a

Spring 2.0的新特性点评

Spring2.0的发布恐怕算得上2006年Java社区的一件大事了.在Spring2.0发布附带的文档里面对2.0新特性做了概要的介绍,2.0的新特性是自然是我们最关注的方面: 一.Spring的XML配置引入XML Schema语法简化配置 在Spring1.x系列中,bean的配置文件使用DTD,没有namespace的分隔.2.0的一个非常大的改进是引入了XML Schema的namespace,因而可以将bean的配置文件做大幅度的简化.这些简化包括了对bean属性的各种简化,AOP配