【问题标题】:C# enum - why does *implicit* casting from 0 work? [duplicate]C# 枚举 - 为什么 *implicit* 从 0 强制转换有效? [复制]
【发布时间】:2013-06-02 08:43:11
【问题描述】:

获取这段代码:

enum En {
    val1,
    val2,
}

void Main()
{
    En plop = 1;  //error: Cannot implicitly convert type 'int' to 'En'
    En woop = 0;  //no error
}

当然,将1 分配给enum 类型的变量时会失败。 (打一个明确的演员表,它会起作用的。)

我的问题是:为什么分配 0 时不会失败?

【问题讨论】:

标签: c# enums compiler-errors


【解决方案1】:

之所以这样,是因为规范是这么说的......

这也是为什么给你的所有枚举一个值为 0 的项目总是一个好主意的另一个原因,因为有时你可能会用这个值来获得它们。


C# 语言规范 6.1.3 中的相应部分:

6.1.3 隐式枚举转换

隐式枚举转换允许将十进制整数文字 0 转换为任何枚举类型以及任何其基础类型为枚举类型的可空类型。在后一种情况下,通过转换为基础枚举类型并包装结果来评估转换(第 4.1.10 节)。

至于为什么会这样 - 好吧,我想只有语言委员会中决定这些事情的人会知道。

事实上,如果您查看 rawling 对原始问题的评论,我们确实有类似的东西。

【讨论】:

  • 你能扩展一下吗?
  • 我不明白这是如何回答这个问题的。默认初始化与允许在代码中使用myEnum = 0 的编译器无关。您不能将 0 分配给结构,但它们仍会默认初始化。您不能将 0 分配给 bool,但它们仍会被默认初始化。
  • @Rawling 好点,我会修改
【解决方案2】:

您只能隐式使用 0 的原因是因为 0 始终是有效的 enum 类型,而 1、2、3 或任何其他数字可能不一定是有效类型。例如试试这个

enum En {
val1=1,
val2=2,
}

0 仍然是有效的enum 类型,因为无论您做什么,0 都是默认值。这意味着如果您不让其中一个值等于 0,它将为您生成 0 enum 类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多