以下代码编译并正确运行:
type FooUnion = MyCase of int * string FSharp.Reflection.FSharpType.GetUnionCases(typeof) |> Array.tryFind(fun a -> a.Name = "MyCase") |> Option.map(fun d -> FSharp.Reflection.FSharpValue.MakeUnion(d, [| 1; "test" |])) |> Option.bind(function | :? FooUnion as s -> Some s | _ -> None)
但是,如果我删除完全限定的FSharp.Reflection并将其移动到open语句,则代码不再编译: -
open FSharp.Reflection type FooUnion = MyCase of int * string FSharpType.GetUnionCases(typeof) |> Array.tryFind(fun a -> a.Name = "MyCase") |> Option.map(fun d -> FSharpValue.MakeUnion(d, [| 1; "test" |])) |> Option.bind(function | :? FooUnion as s -> Some s | _ -> None)
调用MakeUnion时出错: -
没有重载符合'MakeUnion'方法[在VS IDE中]
错误FS0001:这个表达式应该有int类型
但是这里有类型字符串[如果我手动执行代码,则在FSI内]
thinkbeforec.. 5
FSharpValue类型包含一个MakeUnion方法:
static member MakeUnion : unionCase:Reflection.UnionCaseInfo * args:obj [] * ?bindingFlags:System.Reflection.BindingFlags -> obj
但FSharp.Reflection命名空间包含具有略微不同签名的扩展方法.
FSharp编译器仅在没有重载时隐式地封装args数组的内容,因此打开命名空间需要将代码更改为:
FSharpValue.MakeUnion(d, [| box 1; box "test" |])
即使您使用完整命名空间前缀.
FSharpValue类型包含一个MakeUnion方法:
static member MakeUnion : unionCase:Reflection.UnionCaseInfo * args:obj [] * ?bindingFlags:System.Reflection.BindingFlags -> obj
但FSharp.Reflection命名空间包含具有略微不同签名的扩展方法.
FSharp编译器仅在没有重载时隐式地封装args数组的内容,因此打开命名空间需要将代码更改为:
FSharpValue.MakeUnion(d, [| box 1; box "test" |])
即使您使用完整命名空间前缀.