none
请教一个linq的问题? RRS feed

  • 问题

  • 举个例子:        

    string[] arr = { "abab", "bee" };
    arr.Where(s=>s.Length==4)

    arr是个字符串数组类型,那么它就是Array类型。

    但是我在找Array及它的父类的时候,都没有继承IEnumerable<T>接口的。而where是要在IEnumberable接口下的方法。

    请帮忙解答一下。

    2010年4月27日 3:33

答案

  • 我前面说过了,这里所谓隐式,是指编译器帮我们实现的,编译器翻译成 IL 时实现的,

    我不知道你的指的类图是那种,如果某种类图工具是分析 IL 来生成的那就会体现出来了,另外因为 System.SZArrayHelper+SZGenericArrayEnumerator`1[System.Int32] 是 internal 的所以这种类图工具一般也不生成这种 internal ,就像 .NET 类库有很多 internal,但你izai MSND 中是找不到的,本来 internal 的东东就不需要告诉你 

    展开看,你会发现.net 语言中有很多特性是编译器帮我们做了很多工作的,比如匿名类型,匿名方法,通过 += 或者 -= 简便添加或移除事件处理 。。。。。


    问题要简单,错误须详细@错误/异常/堆栈信息+操作系统+软件版本+all the context of the issue Hope Helpful | http://www.leoworks.net
    2010年4月28日 3:30

全部回复

  • System.Array 类型继承于 System.Collections.IList 接口和 ICloneable 接口。其中System.Collections.IList 接口又继承于ICollection 接口,ICollection 接口又继承于IEnumerable 接口。

    因此System.Array 必然实现了Where 方法。

    2010年4月27日 5:43
  • where方法是要IEnumerable<T>接口啊。
    2010年4月27日 5:55
  • 实际上数组是隐式实现 IEnumerable<T>接口的,这是编译器帮我们实现的,你可以运行下面的代码就知道了 int[] 实际上实现了 IEnumerable<int>

        class Program
        {
            static void Main(string[] args)
            {
                int[] numArray = { 1, 2, 3, 4, 5 };
                Console.WriteLine(numArray.GetEnumerator()); // 显示实现,System.Array+SZArrayEnumerator
                IEnumerable<int> numEnum = numArray as IEnumerable<int>;
                if (numEnum != null) // true
                {
                    IEnumerator<int> iterator = numEnum.GetEnumerator(); 
                    Console.WriteLine(iterator.GetType()); // 隐式实现的 System.SZArrayHelper+SZGenericArrayEnumerator`1[System.Int32]
                    while (iterator.MoveNext())
                    {
                        Console.WriteLine(iterator.Current);
                    }
                }
                Console.ReadKey();
            }
        }


    问题要简单,错误须详细@错误/异常/堆栈信息+操作系统+软件版本+all the context of the issue Hope Helpful | http://www.leoworks.net
    2010年4月27日 6:46
  • 什么叫隐式实现啊,为什么在它的类继承图上看不出来啊?
    2010年4月28日 3:08
  • 我前面说过了,这里所谓隐式,是指编译器帮我们实现的,编译器翻译成 IL 时实现的,

    我不知道你的指的类图是那种,如果某种类图工具是分析 IL 来生成的那就会体现出来了,另外因为 System.SZArrayHelper+SZGenericArrayEnumerator`1[System.Int32] 是 internal 的所以这种类图工具一般也不生成这种 internal ,就像 .NET 类库有很多 internal,但你izai MSND 中是找不到的,本来 internal 的东东就不需要告诉你 

    展开看,你会发现.net 语言中有很多特性是编译器帮我们做了很多工作的,比如匿名类型,匿名方法,通过 += 或者 -= 简便添加或移除事件处理 。。。。。


    问题要简单,错误须详细@错误/异常/堆栈信息+操作系统+软件版本+all the context of the issue Hope Helpful | http://www.leoworks.net
    2010年4月28日 3:30