gpt4 book ai didi

reflection - F#:如何使用反射获取空可区分联合案例的实例类型?

转载 作者:行者123 更新时间:2023-12-01 21:56:42 26 4
gpt4 key购买 nike

我阅读了这些问题的答案:

但我发现了一些关于受歧视工会的潜在类型的令人惊讶的事情:

type Union1 =
| A
| B

type Union2 =
| A
| B of int

[<EntryPoint>]
let main argv =
printfn "%A" (Union1.A.GetType())
printfn "%A" (Union1.B.GetType())

printfn "%A" (Union2.A.GetType())
printfn "%A" (Union2.B(32).GetType())
0
Program+Union1
Program+Union1
Program+Union2+_A
Program+Union2+B

因此我的问题是当案例为空时如何根据类型区分案例?

最佳答案

无法根据类型区分两个没有参数的联合案例,因为它们在编译的 .NET 代码中的类型是相同的。通过稍微调整您的示例,您可以看到情况就是这样:

type Union1 = A | B     
Union1.A.GetType() = Union1.B.GetType() // Returns 'true'

F# 编译器将 Union1 编译为具有数字 Tag 字段的类。对于这里没有像 AB 这样的额外参数的情况,它只会创建一个 Union1 的实例并设置 Tag 字段到 01

当你有一个带有额外参数的联合案例时,编译器会生成一个新的继承类,然后存储这些参数的值(这就是你为 Union2.B 获得不同类型的原因)。

从 F# 的角度来看,可区分联合的值具有相同的类型(即使 DU 的编译方式意味着该类型有时可以是继承的类),因此没有理由期望您能够根据类型区分案例 - 如果您有需要这样做的案例,您可能应该重新考虑您的方法。

关于reflection - F#:如何使用反射获取空可区分联合案例的实例类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56510719/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com