【问题标题】:What is the open generic type of the array []?数组 [] 的开放泛型类型是什么?
【发布时间】:2011-07-09 04:01:57
【问题描述】:

当我执行int[]、string[]、T[] 时 - 这是一个通用数组。数组只是一个对象,就像其他所有东西一样。

那么 [] 的实际开放泛型类型是什么?我认为这只是Array<> 之类的语法糖,但我找不到任何类似的东西。

如果你能在 Jon Skeet 之前以某种方式回答这个问题,则可以获得奖励积分。

【问题讨论】:

  • 请记住,数组是在在泛型添加到框架之前设计的。如果我们从头开始再做一遍并且泛型在 v1 中,那么可以肯定,数组可能是 Array,就像可空对象是 Nullable。您说得对,数组非常“通用”;从某种意义上说,数组是 v1 CLR 中的唯一泛型类型,这就是为什么它们是如此特殊的类型。下次您从头开始设计自己的类型系统时,请记住尽早添加泛型,而不是稍后添加。
  • 谢谢@Eric,我读到了你的Mark 链接的文章,非常有趣。我想我已经假设当 2.0 出现时,Array 的内部结构被重新设计了。鉴于这些限制,创建通用 IArray 版本不是一个好主意吗?为什么没有发生这种情况?毕竟,数组肯定不同于 IList 和 IEnumerable
  • 我不知道 CLR 团队在那次发布期间的确切想法,但我可以做出有根据的猜测。我的想法是“完美是善的敌人”。鉴于已经有 IList 并且将有 IList 和 IEnumerable 似乎合理地说“好吧,数组足够接近 IList 以使其工作,所以让我们这样做吧而不是引入一个第三个概念IArray”。同样,如果泛型首先出现,那么它可能会以不同的方式下降。
  • 我刚找到 Array.CreateInstance(type, length) ...

标签: c# arrays generics open-generics


【解决方案1】:

这只是 System.Array;它不是通用的。请参阅此处进行简短讨论:http://blogs.msdn.com/b/ericlippert/archive/2007/10/17/covariance-and-contravariance-in-c-part-two-array-covariance.aspx

【讨论】:

  • 它不是通用的?但它可以直接转换为 IEnumerable
  • 因为 System.Array 实现了IEnumerable<T>。以及泛型的 ICloneable、IList、ICollection、IEnumerable、IStructuralComparable、IStructuralEquatable 等。但是,框架在运行时提供了这些实现,因为 Array 本身不是泛型的。
【解决方案2】:

数组比泛型更老。数组从 .net 1 开始可用,而泛型仅在 .net 2 中引入。因此它们不是泛型之上的语法糖。

相反,它们派生自 Array 并使用大量运行时魔法来工作。

此外,引用类型的数组支持一些泛型不支持的变化模式。如果我没记错的话,这样做是为了兼容 Java。

【讨论】:

    【解决方案3】:

    据我所知,不会有Array 的开放泛型类型;它们在泛型出现在 .NET Framework 之前就已经存在。数组只是“奇怪”; System.Array 类型的存在主要是为数组对象提供 O-O 功能。只有运行时可以从中派生。

    但是,System.Array 实现了通用的IList<T>,它强制执行索引器。如果你想要一个强类型的抽象并且接受一个强类型的数组,使用 IList。

    【讨论】:

      【解决方案4】:

      它不仅仅是语法糖,它是 System.Array 类的实际派生。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多