• 好玩的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



  • 相关阅读:
    数字基本数据类型范围比较
    java中float和double的区别
    ASP.NET中javascript与c#互相访问
    Javascript技术之详尽解析event对象
    Java基础-Java中的Calendar和Date类
    逻辑运算符
    JS获取当前时间
    几秒后刷新页面
    【LiteOS】LiteOS任务篇源码分析删除任务函数
    POJ 2385 Apple Catching (DP)
  • 原文地址:https://www.cnblogs.com/puncha/p/3876971.html
Copyright © 2020-2023  润新知