0

正常に動作する関数のバージョンがありますが、異なるデータ型のタプルがあります

これをExcelから使用したいのですが、関数にデータを渡すときは、doubleまたはオブジェクトの配列しか使用できません。私はさまざまなデータ型を持っているので、それらをすべてオブジェクトにアップキャストしてから、これを書き直してボックス化解除を利用しました。

let returnvect (data:obj[][]) (dtsvec:float[]) (inputdate:float) =
let nrhrs = dtsvec |> Array.length
let itera = nrhrs - 1
let res = Array.zeroCreate nrhrs 
let resp = Array.zeroCreate nrhrs
for i=0 to itera do
    for a in data do
        match a.[0] with
        | r when unbox<float> r <= inputdate ->
            match a.[2] , a.[3] with
            | s, t when unbox<float> s <= dtsvec.[i] && unbox<float> t >= dtsvec.[i] -> 
                    res.[i] <- res.[i] + unbox<float> a.[4] 
                    resp.[i] <- resp.[i] + unbox<float> a.[5]  * unbox<float> a.[4] 
            |_ -> 
                res.[i] <- res.[i] + 0.0
                resp.[i] <- resp.[i] + 0.0
        |_ -> 
            res.[i] <- res.[i] + 0.0
            resp.[i] <- resp.[i] + 0.0
let avgprice = dotdivideZ resp res
let inp = [|dtsvec; res; avgprice|]
let newres = MultiArray inp
newres

型チェックには合格しますが、実行すると次のエラーが発生します。

System.InvalidCastException: Specified cast is not valid.
 at FSI_0044.returnvect(Object[][] data, Double[] dtsvec, Double inputdate)

アイデアはありますか?ありがとう!

4

1 に答える 1