我有一个函数,我按以下方式将一些元素添加到数组中:
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 []进行此类工作的最佳方法应该是什么,我需要在返回之前编辑一些特定的索引。
答案 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.zeroCreate
或Array.init
)。