当前位置:  开发笔记 > 编程语言 > 正文

反映F#Disriminated Union时的奇怪行为

如何解决《反映F#DisriminatedUnion时的奇怪行为》经验,为你挑选了1个好方法。

以下代码编译并正确运行:

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" |])

即使您使用完整命名空间前缀.



1> thinkbeforec..:

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" |])

即使您使用完整命名空间前缀.

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有