我意识到受歧视的工会不一定和enums一样。但就这些类型的DU而言:
type Colors = Red | Green | Blue
它们被视为类Colors
,其中每种颜色都是一个只读属性,指的是Colors
类的实例。
对于可以比作枚举的这些类型的DU,为什么它们不被视为C#中的枚举?
答案 0 :(得分:6)
如果你这样定义,你可以在F#中使用枚举:
type Colors = Red = 1 | Green = 2 | Blue = 3
被识别的联合被视为C#中的类,因为它们是如何由编译器编码的 - 作为联合类型的类和一组案例的嵌套类。这就是代码的所有非F#客户端所看到的 - 不幸的是,这包括您使用F#中的.NET反射API访问受歧视的联合的时间。
由于可以携带任意参数的复杂案例,联盟由类表示 - 这是对它们进行编码的自然方式。我想有一点可以说,对于所有情况都没有参数的情况,编译器可以生成枚举。但是这会使联合的编译表示以非常疯狂的方式异构 - 从简单的联合将是值类型和复杂的联合将是引用类型的事实开始。这会增加语言的陷阱数量将是灾难性的!
答案 1 :(得分:4)
枚举在概念上与F#区别联合不同,因为它们是可扩展的。
以下是来自F#的CLI枚举的有效声明和用法。生成的枚举与C#兼容:
type A = Alpha = 1 | Alice = 2
let a = enum<A>(56)
与类似的DU比较:
type B = Beta | Bob
// No way to instantiate B except the above cases
因此,即使在可能的情况下,将DU编译为枚举也会使其不如DU的预期严格。正如所料,以下内容给出了警告:
// Compiler warning: incomplete pattern matches.
match a with A.Alpha -> '!' | A.Alice -> '?'