【发布时间】:2014-09-02 12:56:01
【问题描述】:
考虑这个结构:
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 类决定了相等性,而在第一种情况下,我的类决定了它。但是我的课程可以隐式转换为int,所以这不是有帮助吗?
如何使 Assert.AreEqual 双向工作?顺便说一句,我正在使用 MSTest。
更新
实现IEquatable<int> 或IComparable<int> 没有帮助。
【问题讨论】:
-
想知道是否值得实施
IEquatable? -
@Charleh:如果您要将值存储在集合中,那么值得实现
IEquatable<T>。它将加快Contains、IndexOf等操作的速度。 -
不是
IEquatable@Charleh,IComparable<int>。这将确保该类也适用于Greater和Less断言。 -
您使用的是哪个单元测试框架?您是使用
Microsoft.VisualStudio.TestTools.UnitTesting.Assert断言还是使用不同的单元测试框架? -
好问题,我确实在使用 MSTest。