【发布时间】:2016-07-17 20:40:38
【问题描述】:
我正在使用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
但这也给了我一个错误:
如果我不执行
Array.map,请在函数的最后一行键入不匹配。
【问题讨论】:
-
@phillip-trelford - “您还可以更改一个函数以接受任何对象数组,例如 let one (a:#obj[])”(与我的“答案”一起删除 - 恢复为有价值)FSharpValue.MakeUnion 上使用它(除非我弄错了)
-
您可以创建自己的 MakeUnion 函数,该函数调用 FSharpValue.MakeUnion
-
托马斯的答案可能是我的默认答案,您也可以将
(fun s -> s:>obj)缩短为box -
buildArgs定义没有给我任何类型不匹配 - 它返回一个字符串数组 -
@CodeBeard 最短但可能是
buildArgs最邪恶的解决方法是(content |> split " ") |> box |> unbox
标签: types casting f# type-conversion