1

假设我声明了这个字符串数组:

string[] arr = new string[]{"foo", "bar"};

LINQ 扩展方法是如何附加到它的?

我知道 LINQ 扩展方法是在 System.Linq.Enumerable 中声明的,但是扩展方法作用于IEnumerable<TSource>

public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);

由于 arr 不是通用的,并且据我所知没有实现扩展方法IEnumerable<T>是如何Where()附加到它的?

4

1 回答 1

2

文档中:

从 .NET Framework 2.0 开始,Array该类实现System.Collections.Generic.IList<T>System.Collections.Generic.ICollection<T>System.Collections.Generic.IEnumerable<T>泛型接口。这些实现在运行时提供给数组,因此对文档构建工具不可见。因此,泛型接口不会出现在Array类的声明语法中,并且没有接口成员的参考主题,只能通过将数组转换为泛型接口类型(显式接口实现)才能访问这些成员。将数组强制转换为这些接口之一时要注意的关键是添加、插入或删除元素的成员 throw NotSupportedException

因此,由于T[] 确实implement IEnumerable<T>,并且编译器完全意识到这一事实,因此IEnumerable<T>在数组上使用定义在 s 上的扩展方法是完全合法的。

于 2013-07-26T13:57:56.123 回答