gpt4 book ai didi

types - obj[] 和 string[] 作为参数

转载 作者:行者123 更新时间:2023-12-04 14:14:11 24 4
gpt4 key购买 nike

我正在使用 Microsoft.FSharp.Reflection.FSharpValue.MakeUnion这需要一个 Reflection.UnionCaseInfo和一个 obj[] (可以为空)作为参数。

但是,我得到了一个Type mismatch. Expecting a obj [] but given a string [] The type 'obj' does not match the type 'string'当调用函数的结果为 string[] 时.

我可以为这种情况创建的最简单的示例如下(我有一个测试围绕此展开,但由于标记为 !! 的行而无法编译。

let one (a:obj[]) = a |> Array.map (fun o->printfn "%A" o) |> ignore
one [|"a";"b";"c"|] // OK!
let str = [|"a";"b";"c"|] //the equivalent of my function return
one str//!!Type mismatch.

我不确定我是否打算将 string[] 转换/转换为 obj[] 或......好吧,如果我只是在做我不知道的其他错误。

编辑:实际问题如下所述
let split (by:string) (input:string) = System.Text.RegularExpressions.Regex.Split(input,by)

let buildArgs content =
match content with
| "" -> [||]
| _ -> content |> split " " //Type mismatch

这就是我曾经解决的问题:有没有更好的方法?
 | _ -> content |> split " "|> Array.map (fun s->s:>obj)//make sure obj[] is returned

Casting and Conversions (F#)作为引用

我也试过这个
let buildArgs content :obj[] = ... // Type mismatch

但这也给了我一个错误:

Type Mismatch on the last line of the function if I don't do the Array.map.

最佳答案

我认为你目前的方法很好;有时我会发现类似 [|for str in ... -> box str|] 的内容比 ... |> Array.map (fun str -> box str) 更具可读性但您的里程可能会有所不同。至于你为什么会遇到这个问题,这里有两个微妙的问题。

正如 Phil Trelford 的评论所暗示的,.NET 类型系统允许 string[]被视为 obj[] (尽管从 F# 执行此操作需要向上转换和向下转换,即使 .NET 类型系统并不那么严格)。在我看来,这种类型系统的“功能”是令人厌恶的,即使在这种情况下它可能是安全的,我通常也会避免使用它(关于数组协方差的不可取性的一致意见,请参阅 Covariance and Contravariance in C#, Part Two: Array CovarianceArray covariance: not just ugly, but slow too )。

所以一般来说,string[]不会被视为 obj[]由编译器。为什么当你通过时一切都很好[|"a"; "b"; "c"|] ?这里的答案是,在数组文字的特定情况下,编译器允许数组表达式的类型是每个元素类型的父类(super class)型,如果可以推断出这样的父类(super class)型(例如,因为它被另一个元素的签名限制为 obj[])方法,如您的情况)。但是,这只适用于数组文字(即形式为 [|e1; e2; ... |] 的表达式)。

关于types - obj[] 和 string[] 作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18301515/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com