比较两个不同枚举的最佳方法是什么?

本文关键字:枚举 最佳 方法 是什么 两个 比较 | 更新日期: 2023-09-27 18:18:08

我在想比较两个不同枚举值的最佳方法是什么

的例子:

public enum ExampleEnumA
{
    ExampleValue
}
public enum ExampleEnumB
{
    ExampleValue
}
 if (ExampleEnumA.ExampleValue.ToString() == ExampleEnumB.ExampleValue.ToString())
 {
 }

比较字符串是有效的,但我知道这不是最有效和最聪明的方法。如何才能做得更好?

编辑:

也许这是一个设计缺陷,但这是一个真实项目的问题,而不是我对枚举的错误理解。这就是它的样子,没有时间重构整个方法。

public interface IProvider
{
    Enum SectionType { get; }
}
public class FirstProvider : IProvider
{
    public Enum SectionType
    {
        get { return ExampleEnumA.ExampleValue; }
    }
}
public class SecondProvider : IProvider
{
    public Enum SectionType
    {
        get { return ExampleEnumB.ExampleValue; }
    }
}
public class Program
{
    public void TmpMethod(Enum sectionType)
    {
        var provider = GetFromIoC...
        if (provider.SectionType == sectionType)
        {
            //...
        }
    }
}

比较两个不同枚举的最佳方法是什么?

枚举就像是在基于整数的常量的常规类之上的抽象层。

该抽象包括计算false,即使两个枚举值是相同的整数,但属于不同的枚举类型。

比较具有相同底层值的两种不同枚举类型的最佳方法是什么?我的回答是,如果需要执行这个求值,那么应该是一个设计缺陷。

例如,假设我们实现了以下枚举:
public enum States
{
    Open = 1, 
    Closed
}
public enum SpecialFolders 
{
     ProgramFiles86 = 1,
     ProgramFiles64
}

States.Open == SpecialFolders.ProgramFiles86这样有意义吗?潜在地,它们看起来是相等的(它们不会),因为两个枚举值都有一个潜在的值1,但是如果枚举类型不相同,1并不意味着相同。

这就像在说……

    面包

…与

相同
  1. (偷面包= =偷窃 ????????????)
  2. 木头

也许…

…您可以破坏将常量作为枚举类型键入的目的,将它们强制转换为int:

if ((int)ExampleEnumA.ExampleValue == (int)ExampleEnumB.ExampleValue)
{
}

…如果底层类型是int。也可以是long:

public enum SomeEnum : long 
{
}

…并且需要将计算的左右部分强制转换为long,等等。

无论如何,我坚持认为你不应该这样做。也许你应该使用常规的常量类,这样你就可以避免每次求值两次强制类型转换:
public static class States
{
     public const int Open = 1;
     public const int Closed = 2;
}
public static class Materials
{
    public const int Steel = 1;
    public const int Wood = 1;
}
// true! but not that true... I can't understand why these constants equal...
if(States.Open == Materials.Wood)
{
}

顺便说一句,我仍然认为这是一个设计缺陷,你应该避免不使用枚举来解决一个糟糕的设计决策。