为什么枚举式联合在C#中被视为一个类?

时间:2014-11-08 08:10:48

标签: c# enums f# clr discriminated-union

我意识到受歧视的工会不一定和enums一样。但就这些类型的DU而言:

type Colors = Red | Green | Blue

它们被视为类Colors,其中每种颜色都是一个只读属性,指的是Colors类的实例。

对于可以比作枚举的这些类型的DU,为什么它们不被视为C#中的枚举?

2 个答案:

答案 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 -> '?'