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

标签 c# enums f# clr discriminated-union

我意识到可区分联合不一定与枚举相同。但对于这些类型的 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/

相关文章:

c# - PagedViewCollection 按列分组,而不是属性

f# - 如何在 F# 中实现获取最大元素函数?

c# - 从动态程序集/模块中删除类

c# - 如何在 C# 中使用 Open XML 从 Word 文档中查找准确的单词?

java - 在 Java 中将字符串转换为枚举

c# - 如何在 XAML 中使用枚举类型?

F# 让绑定(bind)模式

f# - 为什么 reduce 比 sum 或 sumBy 快?

c# - 在 OSX : "No assembly containing System.Object was found" 上使用 .NET Core 从代码调用 Roslyn

c# - 从枚举中填充复选框列表