当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > C#教程:隐式类型数组

ASP.NET
Script:WINDOWS Script 枚举运行中进程
使用Flex结合Webservice完成域名查询
VSTS Team System 总算装好了。
用于部署数据库的 数据库初始化工具 xzSQLDeploy Tools V1.0 (for SQLServer) f...
一个将阿拉伯数字转换成中文大写的最简单算法
SCRIPT:使用Windows Script 关闭和打开指定程序
Script:使用WINDOWS脚本访问WEB SERVICES
asp.net连接Access数据库
VB中IIS Application发布可能出现的问题
VB打包后的安装问题
Nhibernate的数据分页技术(续)
使用API函数复制文件,可显示进度。
VB打包技巧
VB.NET实现DirectSound9 (9) 实现示波器
VB.NET 实现DirectSound9 (10) 均衡器
[水晶报表部署系列之一]轻松搞定水晶报表9.2打包
DataGrid 中双向排序的一种办法
利用System.EventHandler来实现两个窗体间的事件调用
多线程应用程序中调用窗体的一点心得
Smart Client之旅一:用B/S方式运行Exe应用程序

ASP.NET 中的 C#教程:隐式类型数组


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-28   浏览: 140 ::
收藏到网摘: n/a

隐式类型数组

在C# 1和2中, 初始化一个数组作为声明一个变量的一部分其表达式是相当简洁的——但是如果你想在任何地方创建它, 你不得不声明数组的显式类型. 因此下面的例子完全可以听过编译而没有任何问题:

 1: string[] names = {"Holly", "Jon", "Tom", "Robin", "William"};

下面的代码则无法工作, 即便我们声明了方法MyMethod的签名为MyMethod(string[] names):

 1: MyMethod({"Holly", "Jon", "Tom", "Robin", "William"});

相反, 我们不得不告诉编译器你想要初始化的数组类型:

 1: MyMethod(new string[] {"Holly", "Jon", "Tom", "Robin", "William"});

C# 3则允许类似下面这样的调用:

 1: MyMethod(new[] {"Holly", "Jon", "Tom", "Robin", "William"});

很明显, 编译器需要去推断出要使用的数组类型. 从大括号里面的元素开始, 如果能够找到一个所有其他元素都可以隐式转换的类型, 那么这就是数组的类型, 否则代码将无法编译. 如果元素是类型无关的的表达式, 例如常量null或者匿名函数, 代码也无法编译. 注意只有表达式的类型会被考虑为整体数组类型的候选. 这意味着我们可能偶尔不得不将一个值显式转换到另外一个范围更小的类型. 例如, 下面的代码将无法编译:

 1: new[] { new MemoryStream(), new StringWriter() }

无法从MemoryStream转换到StringWriter, 反之也一样. 虽然两者都能够被转换成object或者IDisposable, 但编译器仅仅考虑表达式本身所产生的类型. 在这个例子中, 如果我们将其中的一个类型显式转换到object或者IDisposable接口, 那么代码将可以编译通过:

 1: new[] { (IDisposable) new MemoryStream(), new StringWriter() }

最后整个表达式的类型是IDisposable[]. 比较一下之前我们提到的其他特性, 隐式类型数组有一点点令人泄气. 虽然他们确实让生活变得更加简单一点, 例如传递数组作为参数的例子. 然而你可以争论的一点是其并没有在”用处和复杂度”的平衡上证明自己, 而这一点通常是语言设计者用来决定哪些特性应该成为语言的一部分. 设计人员没有发疯, 然而——有一个很重要的情形, 在那里隐式类型数组是非常关键的. 那就是当你不知道(实际上根本无法知道)数组里面元素的类型名称的时候, 你如何才能进入这种特殊的状态? 待续!