7

我创建了两个枚举,我知道它们不一样,但我仍然认为它们相等是有道理的,因为它们的字符串表示形式和数字表示形式是相等的(甚至是相同的......)。

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

谢谢!

    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)所以到目前为止所有的答案都是比较表示,无论是整数还是字符串。我收集的枚举本身总是不平等的?没有办法为它定义平等吗?

4

7 回答 7

14

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

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

另外,我想挑战这样一种说法,即因为它们具有相同的整数或字符串表示形式,所以它们应该相同或等于。给定两个枚举NetworkInterface和,C# 或 .Net 框架允许在作为枚举比较时通过值或字符串相等VehicleType是不合逻辑的。但是,如果开发人员将强类型枚举转换为整数或字符串,则语言或框架无法阻止两者相等。NetworkInterface.NoneVehicleType.None

为了进一步澄清,您不能重写MyEnum.Equals以提供不同的相等方法。.Net 枚举在 Java 的更高版本中并不是一等公民,我希望 C# 允许与枚举进行更丰富的交互。

于 2009-11-05T21:24:31.120 回答
3

我向您推荐 C# Language Specification 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);
}
于 2009-11-05T21:32:39.543 回答
2

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

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

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

不过,我不记得遇到过需要两个不同枚举来表示同一事物的情况。

于 2009-11-05T22:23:05.737 回答
1

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

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

会通过,因为它们都是第一个列出的。如果您希望它们匹配,因为它们都说“一”,那么您需要使用反射。

于 2009-11-05T21:24:17.157 回答
1

老实说,大多数时候平等并不是直截了当的。

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

于 2009-11-05T21:29:31.233 回答
0
    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); 
    }
于 2009-11-05T21:24:15.923 回答
0

您可以尝试投射它们:

Assert.AreEqual((int)enumA.one, (int)enumB.one);
于 2009-11-05T21:24:30.387 回答