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

Ove*_*ive 2 c# clr enums f# discriminated-union

我意识到受歧视的工会不一定和enums一样.但在这些类型的DU的情况下:

type Colors = Red | Green | Blue
Run Code Online (Sandbox Code Playgroud)

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

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

scr*_*wtp 6

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

type Colors = Red = 1 | Green = 2 | Blue = 3
Run Code Online (Sandbox Code Playgroud)

被区分的联合被视为C#中的类,因为这是编译器对它们进行编码的方式 - 作为联合类型的类和一组案例的嵌套类.这就是代码中所有非F#客户端看到的内容 - 遗憾的是,这包括您使用F#中的.NET反射API访问受歧视的联合的时间.

由于可以携带任意参数的复杂情况,联合由类表示 - 这是对它们进行编码的自然方式.我想有一点可以说,对于所有情况都没有参数的情况,编译器可以生成枚举.但是这会使联合的编译表示以非常疯狂的方式异构 - 从简单的联合将是值类型和复杂的联合将是引用类型的事实开始.这会增加语言的陷阱数量将是灾难性的!