考虑以下结构体:
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或IComparable也没有用。
IEquatable
接口? - CharlehIEquatable<T>
是值得的。它可以加速像Contains
、IndexOf
等操作。 - Martin LiversageIEquatable
@Charleh,而是IComparable<int>
。这将确保该类也能与Greater
和Less
断言一起使用。 - Rob EpsteinMicrosoft.VisualStudio.TestTools.UnitTesting.Assert
进行断言,还是使用其他单元测试框架? - Martin Liversage