为什么types化的.NET数组不是generics? (即SomeType != Array {SomeType})

[背景:]为了使对Excel的interop API编程更容易,我为常见的任务创build了很多扩展方法。 其中许多是Excel的集合对象,如工作簿,表格等的LINQ风格的方法。所有的扩展方法在一个程序集中,我在任何应用程序或插件中引用该程序集需要的方法。 扩展方法程序集和目标应用程序都embedded了来自同一主互操作程序集的互操作types。 所有东西都是用.NET 4.0编写的,引用了PIA版本15。

我只是为ListObjects接口创build了一些扩展方法,它们给我编译器错误,“组件Y.dll中的成员X不能跨越程序集边界使用,因为它包含一个具有通用types参数的types,该参数是embedded式互操作types“。

这是导致错误的方法:

public static IEnumerable<ListObject> Where(this ListObjects me,Func<ListObject, Boolean> condition) { var list = new List<ListObject>(); foreach (ListObject x in me) if (condition(x)) list.Add(x); return list; } 

这是一个类似的方法,

 public static IEnumerable<Workbook> Where(this Workbooks me, Func<Workbook, Boolean> condition) { var list = new List<Workbook>(); foreach (Workbook x in me) if (condition(x)) list.Add(x); return list; } 

为什么一个人在议会边界工作而另一个不在?


更正,这两个方法都没有在这个特定的应用程序工作。 但是,通过为ListObjects创build一个ToArray()扩展方法,然后在我的应用程序中调用该方法,并在该数组上调用LINQ方法,我能够获得所需的结果。

为什么强types列表不算作genericstypes?

ListObject []不仅仅是Array {ListObject}的语法糖吗?

那么,最简​​单的答案是非常简单的 – 当数组被添加到语言中时,就没有generics。

现在,每个数组都是从Array类派生的 – 但是,没有generics(不可用),将无法实现types安全性,更不用提性能影响了。 相反,数组是介于基本types和派生自Array的类之间的某处。

当然,最后, T[]Array<T>之间没有什么实质性的区别 – 实际上,在实现“适当”generics之前,可以说数组从一开始就是generics的。

List<T>是一个完全独立的类,它只是在内部使用T[]来存储实际的数据。 这是非generics对应的是ArrayList – 在仿制药进入语言和CLR之前,也是这样。

最后,你不需要经历这些问题 – LINQ扩展方法不适合你的原因是像ListObjects这样的集合没有实现IEnumerable<ListObject> ,而只是IEnumerable 。 .NET的devise者当然知道这一点,所以你可以很容易地将enumerable转换为适当的 – 例如, listObjects.OfType<ListObject>().Where(i => ...) 。 无需编写自己的扩展方法;)

Interesting Posts