【发布时间】:2016-10-14 17:39:40
【问题描述】:
我们今天在代码中遇到了一个错误。我们有几个列表,其中数据的键是枚举。有多个不同的枚举用作键(下面代码中的 Foo.Bar1 和 Foo.Bar2)。
所有测试都有一个 DataFields 列表,其中包含 1 个项,其中键设置为枚举值之一。第一个和最后一个测试按预期运行。第二次测试预计会成功,但失败了。阅读代码时,它似乎是合法的。
我的假设是,通过拆箱变量,枚举值被转换为整数值并进行比较。这使它们相等,从而返回 true,从而使 Any() 方法也返回 true。这个对吗?还是有什么别的事情发生?
我们应该像第三个测试那样使用equals()方法编写比较...
如果在下面的单元测试中重新创建了一个非常简化的问题版本。
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Collections.Generic;
using System.Linq;
namespace EnumCastTest
{
[TestClass]
public class UnitTest1
{
public class DataField
{
public Enum Key { get; set; }
}
class Foo
{
public enum Bar1 { A }
public enum Bar2 { B }
}
[TestMethod]
public void Field_With_Bar1_A_Should_Return_True()
{
List<DataField> fields = new List<DataField> {
new DataField() { Key = Foo.Bar1.A} };
Assert.IsTrue(fields.Any(q => (Foo.Bar1)q.Key == Foo.Bar1.A));
}
[TestMethod]
public void Field_Without_Bar1_A_Should_Return_False()
{
List<DataField> fields = new List<DataField> {
new DataField() { Key = Foo.Bar2.B} };
Assert.IsFalse(fields.Any(q => (Foo.Bar1)q.Key == Foo.Bar1.A));
}
[TestMethod]
public void Field_Without_Bar1_A_Should_Return_False2()
{
List<DataField> fields = new List<DataField> {
new DataField() { Key = Foo.Bar2.B} };
Assert.IsFalse(fields.Any(q => Foo.Bar1.A.Equals(q.Key)));
}
}
}
【问题讨论】:
-
您不能将 Enum 与 Enum 进行比较,因为它们是两种不同的类型。两者在 Enum 中都表示为 0,因此最好将其作为字符串进行比较
-
您应该重命名您的问题,因为它与枚举的类型可转换性有关。
List.Any不相关