为什么类型化的.NET数组不是泛型类型? (即SomeType []!= Array {SomeType})

时间:2015-08-28 16:00:51

标签: c# excel extension-methods com-interop excel-interop

[背景:] 为了更轻松地对Excel的互操作API进行编程,我已经为常见任务创建了许多扩展方法。其中许多是Excel的集合对象(如工作簿,表格等)的LINQ样式方法。所有扩展方法都在一个程序集中,我在任何需要这些方法的应用程序或加载项中引用该程序集。扩展方法程序集和目标应用程序都嵌入了来自同一主互操作程序集的互操作类型。所有内容都是用.NET 4.0中的C#编写的,并引用了PIA 15版。

我刚刚为ListObjects接口创建了一些扩展方法,它们给了我编译错误,"程序集Y.dll中的成员X不能跨程序集边界使用,因为它包含一个具有泛型类型参数的类型这是一个嵌入式互操作类型。"

以下是导致错误的方法:

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创建ToArray()扩展方法,然后在我的应用程序中调用它并在数组上调用LINQ方法来获得所需的结果。

为什么强类型列表不算作泛型类型?

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

1 个答案:

答案 0 :(得分:2)

嗯,最浅的答案很简单 - 当数组添加到语言中时,没有泛型。

现在,每个数组都派生自类型Array - 但是,如果没有泛型(它们不可用),就没有办法实现类型安全,更不用说性能影响了。因此,数组介于基本类型和派生自Array的类之间。

当然,最后,T[]Array<T>之间没有任何有意义的区别 - 事实上,你可以说阵列从一开始就是通用的,早在&#34;正确& #34;仿制药已经实施。

List<T>是一个完全独立的类 - 它只是在内部使用T[]来存储实际数据。它的非通用对应物是ArrayList - 再次,在仿制药进入语言和CLR之前创建。

最后,你不应该经历你的箍 - LINQ扩展方法不适合你的原因是像ListObjects这样的集合没有实现{{1} },但仅限IEnumerable<ListObject>。当然,.NET的设计者已经意识到这一点,因此您可以根据需要轻松转换可枚举 - 例如IEnumerable。无需编写自己的扩展方法;)