Я использую Microsoft.FSharp.Reflection.FSharpValue.MakeUnion
, для этого в качестве параметров требуется Reflection.UnionCaseInfo
и obj[]
(которые могут быть пустыми).obj [] и string [] as parameters
При использовании функции string[]
у меня возникает Type mismatch. Expecting a obj [] but given a string [] The type 'obj' does not match the type '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.
Я не уверен, если я я должен был лить/преобразовать строку [] в obj [] или ... ну, если я просто делаю что-то еще неправильное, о чем я не знаю.
edit: актуальная проблема, как описано ниже
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
.
@ phillip-trelford - «вы также можете изменить одну функцию для принятия любого массива объектов, например, пусть один (a: #obj [])» (удаляется вместе с моим «ответом» - возрождение как ценное) <- thank вы за это предложение. К сожалению, я не могу использовать его на 'FSharpValue.MakeUnion' (если я не ошибаюсь) – CodeBeard
вы могли бы создать свою собственную функцию MakeUnion, которая вызывает FSharpValue.MakeUnion –
Ответ Томаса, вероятно, будет моим дефолтом, также вы можете сократить { s -> s:> obj) 'to' box' –