为什么枚举样式的并集在C#中被视为一个类
本文关键字:一个 样式 枚举 为什么 | 更新日期: 2023-09-27 18:29:44
我意识到有区别的并集不一定与枚举相同。但在这些类型的DU的情况下:
type Colors = Red | Green | Blue
它们被视为类Colors
,其中每种颜色都是引用Colors
类实例的只读属性。
对于这些可以比作枚举的DU类型,为什么它们在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 -> '?'