gpt4 book ai didi

c# - 为什么 Assert.AreEqual(x, y) 会失败,而 Assert.AreEqual(y, x) 不会?

转载 作者:太空狗 更新时间:2023-10-30 00:31:28 25 4
gpt4 key购买 nike

考虑这个结构:

public struct MyNumber
{
private readonly int _value;

public MyNumber(int myNumber)
{
_value = myNumber;
}

public int Value
{
get { return _value; }
}

public override bool Equals(object obj)
{
if (obj is MyNumber)
return this == (MyNumber) obj;

if (obj is int)
return Value == (int)obj;

return false;
}

public override string ToString()
{
return Value.ToString();
}

public static implicit operator int(MyNumber myNumber)
{
return myNumber.Value;
}

public static implicit operator MyNumber(int myNumber)
{
return new MyNumber(myNumber);
}
}

当我在单元测试中这样做时:

Assert.AreEqual(new MyNumber(123), 123);

它是绿色的。

但是这个测试失败了:

Assert.AreEqual(123, new MyNumber(123));

为什么会这样?我猜这是因为 int 类决定了相等性,而在第一种情况下,我的类决定了它。但是我的类(class)可以隐式转换为 int ,那应该没有帮助吗?

如何使 Assert.AreEqual 以两种方式工作?顺便说一下,我正在使用 MSTest。

更新

实现 IEquatable<int>IComparable<int>没有帮助。

最佳答案

第一个断言将调用 MyNumber.Equals 并且如果要比较的参数是 Int32 并且它等于MyNumber 的值。

第二个断言将调用 Int32.Equals 并且它将失败,因为要比较的参数是一个 MyNumberInt32 不知道关于或理解。

您不能使您的第二个单元测试成功,因为您断言 Int32 应该等于您的值。不可能,因为它是不同的。 Int32.Equals 中的代码决定第二个值是否相等。您已经实现了一些可以进行单元测试的转换运算符,因此这些断言应该有效:

Assert.AreEqual(123, (int) new MyNumber(123));
Assert.AreEqual((MyNumber) 123, new MyNumber(123));

即使转换是隐式实现的,它们也不会被Assert.AreEquals自动调用,因为这个方法需要两个Object类型的参数并且您必须像我上面那样显式调用它们。

由于 MyNumber.Equals 中的特殊处理,您现在拥有一个关于等于的不可交换的类型,例如MyNumber(123) equals Int32(123) 为真,但 Int32(123) equals MyNumber(123) 为假。您应该避免这种情况,因此我建议您在 MyNumber.Equals 中删除对 int 的特殊情况处理,而是依赖在大多数情况下都适用的隐式转换。如果他们不这样做,您将不得不进行显式转换。

关于c# - 为什么 Assert.AreEqual(x, y) 会失败,而 Assert.AreEqual(y, x) 不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25623966/

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