gpt4 book ai didi

c# - List.Any() 在预期为 false 时返回 true

转载 作者:行者123 更新时间:2023-11-30 13:54:42 25 4
gpt4 key购买 nike

我们今天在代码中遇到了一个错误。我们有几个列表,其中数据的键是一个枚举。有多个不同的枚举用作键(下面代码中的 Foo.Bar1 和 Foo.Bar2)。

所有测试都有一个包含 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)));
}
}
}

最佳答案

发生这种情况是因为以下返回 true:

var x = Foo.Bar1.A;
var y = (Foo.Bar2)x;
Console.WriteLine(y == Foo.Bar2.B);

枚举在内部由整数值表示,默认使用的类型 is an int :

Every enumeration type has an underlying type, which can be any integral type except char. The default underlying type of enumeration elements is int.

在将一种枚举类型转换为另一种枚举类型时使用此基础类型。因此对于枚举值,正在使用整数值,然后基于此创建新的枚举值。

基本上,这个过程是这样工作的:

var x = Foo.Bar1.A;
int integral = (int)x;
var y = (Foo.Bar2)integral;

除非您为每个枚举成员明确指定数字,否则默认情况下,枚举声明中的位置决定整数值,从0开始。

所以在上面的例子中,integral 将是 0,因为 Bar1.ABar1 的第一个成员>。 Bar2 的第一个成员是 Bar2.B,所以这就是您得到的结果。

所以测试失败的原因是因为当将一个枚举转换为另一种类型时,类型标识丢失了。一般而言,枚举仅在其自己的域中才真正有意义,即当您将同一枚举的一个成员与另一个成员进行比较时。

关于c# - List.Any() 在预期为 false 时返回 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40038552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com