当前位置: 首页 > 编程语言 > C#

C#中的两个枚举何时相同?分享

时间:2023-04-10 12:14:59 C#

C#中两个枚举什么时候相同?我创建了两个枚举,我知道它们不一样,但我认为它们是相同的,因为它们的字符串表示形式和数字表示形式是相等的(甚至相同...)。换句话说:我希望第一个测试通过,第二个测试失败。但实际上,他们都失败了。那么:C#中的两个枚举何时相等?或者有没有在C#中定义等于运算符?谢谢!publicenumenumA{one,two}publicenumenumB{one,two}[测试]publicvoidPreTest(){Assert.AreEqual(enumA.one,enumB.one);Assert.AreSame(enumA.one,enumB.one);}更新:1)所以到目前为止所有的答案都比较表示,无论是整数还是字符串。我收集的枚举本身总是不相等的?没有办法为它定义平等吗?枚举在C#中是强类型的,所以enumA.one!=enumB.one。现在,如果将每个枚举转换为它们的整数值,它们将相等。Assert.AreEqual((int)enumA.one,(int)enumB.one);另外,我想挑战这个说法,因为它们具有相同的整数或字符串表示形式,所以它们应该相同或相等。给定两个枚举NetworkInterface和VehicleType,对于C#或.NetFramework,当作为枚举进行比较时,NetworkInterface.None允许等于VehicleType.None,一个值或一个字符串。但是,如果开发人员将强类型枚举转换为整数或字符串,则语言或框架无法阻止两者相等。为了进一步澄清,您不能覆盖MyEnum.Equals以提供不同的equal方法。.Net枚举在后来的Java版本中不是一等公民,我希望C#允许与枚举进行更丰富的交互。我引用了C#LanguageSpecificationv3.0,它取自第29页的枚举部分:“每个枚举类型都有一个相应的整数类型,称为枚举类型的基础类型。未指定声明基础类型的枚举类型具有底层类型int。枚举类型的存储格式和可能值的范围由其底层类型决定。一个枚举类型可以取的值集合不受其枚举成员的限制。特别是,枚举的基础类型的任何值都可以转换为枚举类型,并且是该枚举的唯一有效值类型。.AreEqual方法实际上测试等价性,而第二个方法测试身份。因此,只需将每种类型转换为其基础类型(在本例中为int)并进行比较。publicenumenumA{一,二}publicenumenumB{一,二}[测试]publicvoidPreTest(){Assert.AreEqual((int)enumA.one,(int)enumB.one);Assert.AreSame(enumA.one,enumB.one);}与Java不同,C#不提供任何向枚举添加方法(例如operator==())的功能。过去,当我需要更智能的枚举时,我所做的是创建一个XHelper类(其中X是枚举的名称),然后我将所有方法放在上面。所以像这样:publicstaticboolEnumAHelper.EqualsEnumB(EnumAenumA,EnumBenumB){return(int)enumA==(int)enumB;虽然,我不记得遇到过我需要两个不同的枚举来表示同一事物的情况。如果您希望它们匹配,请将它们转换为intAssert.AreEqual((int)enumA.one,(int)enumB.one);将通过,因为它们都列在第一位。如果你想让他们匹配,因为他们都说“一”,那么你需要使用反射。老实说,大多数时候平等并不简单。我倾向于创建一个帮助程序类来实现IEqualityComparer(以及任何其他相等性测试,如IsSame())并使用它。publicenumenumA{one=1,two=2}publicenumenumB{one=1,two=2}[测试]publicvoidPreTest(){Assert.AreEqual((int)enumA.one,(int)enumB.one);//我认为这个永远不会通过Assert.AreSame(enumA.one,enumB.one);你可以尝试转换它们:一样吗?分享的所有内容,如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——Assert.AreEqual((int)enumA.one,(int)enumB.one);本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: