F#中数组和int []之间的数据类型不匹配

时间:2014-05-12 13:45:41

标签: arrays f#

我有一个函数,我按以下方式将一些元素添加到数组中:

let mutable result = Array.CreateInstance(typeof<int>, arrayA.Length + arrayB.Length)
....
result.SetValue(arrayA.[iidx], kidx)
....

至少在我看来这是有效的(几天前刚用F#开始......)

问题是当我调用函数并且结果应该是int []并且它返回一个Array。如果我没有错,显然是因为Array.CreateInstance创建了一个数组,但我认为数组将是“兼容的”#39;在我的情况下使用int []。

This expression was expected to have type
  int[]
but here has type
  Array

如何将Array转换为int []?或者对于使用int []进行此类工作的最佳方法应该是什么,我需要在返回之前编辑一些特定的索引。

2 个答案:

答案 0 :(得分:3)

您可以使用Array.CreateInstance模块创建新数组,而不是使用Array

let mutable result = Array.create (arrayA.Length + arrayB.Length) 0
result.[kidx] <- arrayA.[iidx]

答案 1 :(得分:3)

您收到错误的原因是CreateInstance方法返回System.Array,这是所有.NET数组的基类。这可能是因为该方法在泛型存在之前已经在.NET中存在,因此无法使其静态类型安全。

如果您想使用它,可以将结果转换为类型化的int数组int[]

let result = Array.CreateInstance(typeof<int>, 10) :?> int[]
result.[index] <- 42

请注意,您也不需要mutable,因为您没有改变变量 - 您只是改变变量引用的对象。

我希望这可以澄清你为什么会收到错误 - 但正如@Lee正确指出的那样,F#库提供了一个更好的API来处理数组,这是Array模块 - 所以我肯定在F#中编程时,建议使用Array.create(或Array.zeroCreateArray.init)。