我无法理解为什么C#中的数组是协变的,以及这种协方差带来的好处.考虑以下简单的代码示例:
object[] myArray = new string[1];
myArray[0] = 1;
这段代码可以编译好,但是会毫不客气地在运行时爆炸.
如果我尝试使用泛型尝试同样的事情,编译器会抱怨我,我会在早期阶段意识到我的愚蠢,所以我的问题是:为什么C#编译器允许这种与数组的协方差,而且,什么是潜在的好处?
我需要在代码中调用函数我无法修改.该函数需要一个obj[],我想通过它'T[].我可以使用Array.map box,但我试图避免创建一个中间数组.是否有直接的方法将a转换'T[]为obj[]不通过Array.map box或任何其他将创建中间数组的代码?
我正在尝试编写需要与FSharpx.Collections中的PersistentVector类进行互操作的代码.(具体来说,我正在尝试在F#中实现RRB-Trees).PersistentVector基本上是一个B树,其分支因子为32.树中的每个节点都包含两个内容之一:其他节点(如果节点不是叶节点),或者存储在树中的项(如果节点)是一个叶子节点).现在,在F#中表示此数据结构的最自然的方式是使用类似的区分联合type Node<'T> = TreeNode of Node[] | LeafNode of 'T[].但是我认为是性能原因,FSharpx.Collections.PersistentVector代码定义了它的Node类,如下所示:
type Node(thread,array:obj[]) =
    let thread = thread
    new() = Node(ref null,Array.create Literals.blockSize null)
    with
        static member InCurrentThread() = Node(ref Thread.CurrentThread,Array.create Literals.blockSize null)
        member this.Array = array
        member this.Thread = thread
        member this.SetThread t = thread := t
线程代码与我当前的问题无关(它在瞬态向量中使用,它允许某些性能改进),所以让我们删除它以便创建问题的最简单的摘要.删除与线程相关的代码后,我们有一个如下所示的Node定义:
type Node(array:obj[]) =
    new() = …