【发布时间】:2016-01-12 11:51:07
【问题描述】:
以下代码可以正确编译运行:
type FooUnion = MyCase of int * string
FSharp.Reflection.FSharpType.GetUnionCases(typeof<FooUnion>)
|> 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<FooUnion>)
|> 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:此表达式应具有类型
整数
但这里有类型 string [如果我手动执行代码,在 FSI 中]
【问题讨论】:
标签: reflection f# discriminated-union