Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
两个枚举在C#中何时相等?_C#_Enums_Equality - Fatal编程技术网

两个枚举在C#中何时相等?

两个枚举在C#中何时相等?,c#,enums,equality,C#,Enums,Equality,我创建了两个枚举,我知道它们不是相同的,但我仍然认为它们应该是相等的,因为它们的字符串表示和数字表示是相等的(甚至是相同的…) 换句话说,我希望第一次考试通过,第二次考试不通过。但实际上,它们都失败了。那么:C#中的两个枚举何时相等?还是在C#中定义了equals运算符 谢谢 public enum enumA {one, two} public enum enumB {one, two} [Test] public void PreTest() {

我创建了两个枚举,我知道它们不是相同的,但我仍然认为它们应该是相等的,因为它们的字符串表示和数字表示是相等的(甚至是相同的…)

换句话说,我希望第一次考试通过,第二次考试不通过。但实际上,它们都失败了。那么: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)到目前为止,所有答案都比较表示法,无论是整数还是字符串。枚举本身总是不相等的,是吗?没有办法为它定义相等吗?

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

    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);

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

你可以尝试铸造他们:

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

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

Assert.AreEqual((int)enumA.one, (int)enumB.one);
另外,我想质疑这样一种说法,即因为它们具有相同的整数或字符串表示,所以它们应该是相同的或相等的。给定两个枚举
NetworkInterface
VehicleType
,C#或.Net框架允许
NetworkInterface是不合乎逻辑的。无
等于
VehicleType.None
,无论是通过值还是字符串作为枚举进行比较。但是,如果开发人员将强类型枚举强制转换为整数或字符串,则语言或框架无法阻止两者相等


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

老实说,在大多数情况下,平等不是直接的

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

我建议您参考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#不提供任何向枚举添加方法(例如运算符==())的工具

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

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

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

Duplicate:@Robert:感谢您提供的链接,有趣且相关。显然不重复:它要求枚举的值。我认为,您可以这样做,以检查字符串值:Assert.AreEqual(enumA.one.ToString(),enumB.one.ToString()());这里要小心,只有顺序位置相同时才是这样。谢谢。但是!=运算符不是我要找的运算符,而是等于()。我认为,即使不同的强类型也可以是相同的,或者这不是真的吗?@Peter:枚举是结构,而且,你不能重载它们的任何方法。此外,我使用!=作为动词,而不是实际的代码片段。@Tim:的确,这只适用于他的案例和他的案例。枚举是值类型,澄清我的上述观点。这太糟糕了hat MS为虚拟
Equals(Object)
方法使用了与类型特定重载相同的名称;如果将前者命名为
equaletto
,情况会更清楚。事实上,
Equals
仅在将操作数强制转换为
对象时定义等价关系。否则,(4.0).Equals(4.0f)为真[4.0f被转换为并比较为,
double
],但是(4.0f)。Equals(4.0)为假[4.0被转换为并比较为,
对象
]。类似的情况适用于比较枚举类型和整数。非常好的注释(尽管之后).我正在重写一个我希望兼容的现有类,因此它的枚举也应该相同。