考慮這個結構:爲什麼Assert.AreEqual(x,y)失敗,但Assert.AreEqual(y,x)不?
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 2014-09-02 12:58:57
@Charleh:如果你打算將你的值存儲在一個集合中,那麼值得實現'IEquatable'。它會加速像「Contains」,「IndexOf」等操作。 –
2014-09-02 13:11:34
不是'IEquatable' @Charleh,'IComparable'。這將確保該類與「更大」和「更少」斷言一起工作。 –
2014-09-02 13:12:30