我可以依靠整个项目中枚举选项值的唯一性吗?

时间:2019-03-26 09:19:55

标签: c#

我正在编写一个使用多个子类且具有以下定义字段的应用程序:

public _ACTION ACTION { get; set; }
public enum _ACTION { INVALID, UPDATE, VALID }

根据该字段中提供的值,稍后将执行操作。虽然仅实现了第一类,但相应的代码如下:

switch (action) {
    case Class1._ACTION.INVALID:
        this.ColorRow(row, StyleNotOK);
        break;
    case Class1._ACTION.UPDATE:
        this.ColorRow(row, StyleUpdate);
        break;
    case Class1._ACTION.VALID:
        break;
}

随着第二个类(Class2)的出现扩展了与Class1相同的基类(以及此后的每个类),切换将变得更加复杂,我考虑过要做如下的switch语句:

switch (action) {
    case Class1._ACTION.INVALID:
    case Class2._ACTION.INVALID:
        this.ColorRow(row, StyleNotOK);
        break;
    case Class1._ACTION.UPDATE:
    case Class2._ACTION.UPDATE:
        this.ColorRow(row, StyleUpdate);
        break;
    case Class1._ACTION.VALID:
    case Class2._ACTION.VALID:
        break;
}

但是,据我所知,它是一个独特的枚举选项由一个值表示。如果代表枚举选项的值将被使用两次,则该开关可能会失败。

一个解决方案应运而生,使用基类来定义枚举,但是,我对实现的内部感兴趣。您通常可以依靠代表枚举选项的值的唯一性吗?

1 个答案:

答案 0 :(得分:0)

在内部,枚举只是整数(或long或您定义的任何数字类型)。因此,如果您有多个枚举,则将它们强制转换为int并进行比较可以得出相同的值。但是,这就是为什么在比较之前不进行转换。这样可以确保类型安全。如果您的两个枚举不是从同一类型派生的,那么您将无法进行比较,因为您期望的枚举值为Class1._ACTION类型,但是将其与Class2._Action的实例进行比较。它应该给您一个编译时错误。如果枚举的定义是基类的一部分,则实例将是相同的,并且双重比较是多余的,如上面的Jereon所述。