为什么枚举样式的并集在C#中被视为一个类

本文关键字:一个 样式 枚举 为什么 | 更新日期: 2023-09-27 18:29:44

我意识到有区别的并集不一定与枚举相同。但在这些类型的DU的情况下:

type Colors = Red | Green | Blue

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

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

为什么枚举样式的并集在C#中被视为一个类

如果你这样定义它,你可以在F#中有一个枚举:

type Colors = Red = 1 | Green = 2 | Blue = 3

有区别的并集在C#中被视为类,因为编译器就是这样对它们进行编码的——作为并集类型的类和用例的嵌套类集。这就是代码的所有非F#客户端所看到的——不幸的是,这包括您在F#中使用.NET反射API访问受歧视的联合的次数。

联合由类表示,因为复杂的情况可能携带任意参数——这是对它们进行编码的自然方式。我想可以指出的是,对于所有情况都没有参数的情况,编译器可以生成一个枚举。但这将以一种非常疯狂的方式使汇编后的并集表示变得异构——从简单并集将是值类型而复杂并集将为引用类型这一事实开始。这会给语言增加很多陷阱,这将是灾难性的!

枚举在概念上与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 -> '?'