什么时候两个枚举在C#中相同?

我创建了两个枚举,我知道它们不一样,但我认为它们是相同的,因为它们的字符串表示以及它们的数字表示相等(甚至相同……)。

换句话说:我希望第一个测试通过,第二个测试失败。 但实际上,他们都失败了。 那么:C#中的两个枚举何时相等? 或者无论如何在C#中定义equals运算符?

谢谢!

public enum enumA {one, two} public enum enumB {one, two} [Test] public void PreTest() { Assert.AreEqual(enumA.one,enumB.one); Assert.AreSame(enumA.one, enumB.one); } 

更新:1)所以到目前为止所有答案都比较表示,无论是整数还是字符串。 enum 本身总是不平等的我聚集在一起? 没有办法为它定义平等吗?

枚举是在C#中强类型的,因此enumA.one != enumB.one 。 现在,如果您将每个枚举转换为它们的整数值,它们将是相等的。

 Assert.AreEqual((int)enumA.one, (int)enumB.one); 

另外,我想挑战一下这句话,因为它们具有相同的整数或字符串表示,它们应该相同或相等。 给定两个枚举NetworkInterfaceVehicleType ,对于C#或.Net Framework来说,当比较为枚举时,允许NetworkInterface.None等于VehicleType.None ,或者是值或字符串。 但是,如果开发人员将强类型枚举强制转换为整数或字符串,则语言或框架无法阻止二者进行等式。

为了进一步说明,您不能覆盖MyEnum.Equals以提供不同的相等方法。 .Net枚举不是他们在Java的更高版本中的第一类公民,我希望C#允许与Enums进行更丰富的交互。

我引用了C#语言规范v3.0,该引用是从第29页的Enum部分中提取的:

“每个枚举类型都有一个相应的整数类型,称为枚举类型的基础类型。未明确声明基础类型的枚举类型具有基础类型int。枚举类型的存储格式和可能值的范围由其确定基础类型。枚举类型可以采用的值集不受其枚举成员的限制。特别是,枚举的基础类型的任何值都可以强制转换为枚举类型,并且是该枚举的唯一有效值类型。”

.AreEqual方法实际上是测试等价,而第二个测试身份。 因此,只需将每个类型转换为其基础类型(在本例中为int),然后进行比较。

 public enum enumA { one, two } public enum enumB { one, two } [Test] public void PreTest() { Assert.AreEqual((int)enumA.one,(int)enumB.one); Assert.AreSame(enumA.one, enumB.one); } 

与Java不同,C#不提供任何用于向枚举添加方法(例如operator ==())的工具。

我在过去需要更智能的枚举时所做的就是创建一个XHelper类(其中X是枚举的名称),然后我将所有方法放在上面。 因此这样的事情:

 public static bool EnumAHelper.EqualsEnumB(EnumA enumA, EnumB enumB) { return (int)enumA == (int)enumB; } 

虽然,我不记得碰到一个案例,我需要两个不同的枚举来表示同样的事情。

如果您希望它们匹配,请将它们转换为int

 Assert.AreEqual((int)enumA.one,(int)enumB.one); 

会通过,因为他们都是第一个列出。 如果你想让它们匹配,因为它们都说“一”,那么你需要使用reflection。

说实话,平等在大多数时候都不是直截了当的。

我倾向于创建一个实现IEqualityComparer(以及任何其他相等测试,例如IsSame())的助手类并使用它。

  public enum enumA {one = 1, two = 2} public enum enumB {one = 1, two = 2} [Test] public void PreTest() { Assert.AreEqual((int)enumA.one, (int)enumB.one); // I don't think this one will ever pass Assert.AreSame(enumA.one, enumB.one); } 

你可以尝试投射它们:

 Assert.AreEqual((int)enumA.one, (int)enumB.one);