我意识到可区分联合不一定与枚举相同。但对于这些类型的 DU:
type Colors = Red | Green | Blue
它们被视为类 Colors
,其中每种颜色都是一个只读属性,引用 Colors
类的实例。
对于这些可以比作枚举的 DU,为什么在 C# 中不将它们视为枚举?
最佳答案
如果你这样定义它,你可以在 F# 中拥有一个枚举:
type Colors = Red = 1 | Green = 2 | Blue = 3
区分联合在 C# 中被视为类,因为这就是它们被编译器编码的方式 - 作为联合类型的类和一组用于案例的嵌套类。这是您代码的所有非 F# 客户端看到的内容 - 不幸的是,这包括您在 F# 中使用 .NET 反射 API 访问有区别的联合的时间。
联合由类表示,因为可以携带任意参数的复杂情况 - 这是对它们进行编码的自然方式。我想可以指出,对于所有情况都没有参数的情况,编译器可以生成一个枚举。但这将使联合的编译表示以一种非常疯狂的方式异构化——从简单联合将是值类型而复杂联合将是引用类型这一事实开始。这会增加到语言中的陷阱数量将是灾难性的!
关于c# - 为什么枚举样式的联合在 C# 中被视为一个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26815135/