• 好玩的Array类型


    今天学习LinQ的时候,为了研究LinQ到底支不支持实现了IEnumerable(非泛型)接口的对象发现了有趣的现象,LinQ是不支持的,但是LinQ竟然可以对string[] 查询,据我所知,所有的数组都是派生自Array基类,那么是Array实现了IEnumerable<T>接口?通过F12查看Array的定义,发现也没有啊!那么。。。长话短说,Array是实现IEnumeable<T>的,但是这个是运行时赋予的!所以通过F12查询他的定义是看不到的。。以下代码能正确执行:


                Array arr = new string[] {"tiger", "lion", "cat"};;
                IEnumerable<string> enumableArr = arr as IEnumerable<string>;
    
                IEnumerable<string> query = from item in enumableArr select item;
                foreach(var str in query)
                    Console.WriteLine(str);

    但要注意,因为是运行时赋予的,所以以下代码不能通过编译(因为LinQ需要一个实现了IEnumerable<T>的对象:


                Array arr = new string[] {"tiger", "lion", "cat"};;
    
                IEnumerable<string> query = from item in arr select item;
                foreach (var str in query)
                    Console.WriteLine(str);


    这个是MSDN的解释:

    Array 类是支持数组的语言实现的基类。但是,只有系统和编译器能够从 Array 类显式派生。用户应当使用由语言提供的数组构造。

    一个元素就是 Array 中的一个值。Array 的长度是它可包含的元素总数。Array 的秩是 Array 中的维数。Array 中维度的下限是 Array 中该维度的起始索引,多维 Array 的各个维度可以有不同的界限。

    Note重要事项:

    在 .NET Framework 2.0 版中,Array 类实现 System.Collections.Generic.IListSystem.Collections.Generic.ICollection 和 System.Collections.Generic.IEnumerable 泛型接口。由于实现是在运行时提供给数组的,因而对于文档生成工具不可见。因此,泛型接口不会出现在 Array 类的声明语法中,也不会有关于只能通过将数组强制转换为泛型接口类型(显式接口实现)才可访问的接口成员的参考主题。将某一数组强制转换为这三种接口之一时需要注意的关键一点是,添加、插入或移除元素的成员会引发 NotSupportedException

    http://msdn.microsoft.com/zh-cn/library/system.array(VS.80).aspx



  • 相关阅读:
    Brackets 前端编辑器试用
    java面试题之第一回
    java数据类型
    [转]JAVA标识符和关键字
    Servlet的几个关键知识点
    一个Servlet中可以有多个处理请求的方法
    基于java的聊天室/群发控制台程序
    java 创建string对象机制 字符串缓冲池 字符串拼接机制
    git 常用命令
    ajax axios 下载文件时如何获取进度条 process
  • 原文地址:https://www.cnblogs.com/puncha/p/3876971.html
Copyright © 2020-2023  润新知