我正在创建一个 Volume 值类型,到目前为止一切顺利,但是当我覆盖乘法运算符并编写单元测试时,如果测试失败而不是获得预期和实际数量,我将获得完整的限定类型名称。
代码内容不多:
private decimal amount;
public Volume(decimal value)
{
amount = value;
}
public static implicit operator Volume(decimal value)
{
return new Volume(value);
}
//... continue same methods with all number types
public static Volume operator *(Volume left, decimal right)
{
return new Volume(left.amount * right);
}
使用这段代码,如果我编写了一个失败的测试,而不是得到预期的和实际数量的失败消息,我会得到:
Message: Assert.AreEqual failed. Expected: <MyTypes.Utilities.Volume>. Actual: <MyTypes.Utilities.Volume>.
我尝试添加以下内容:
public static implicit operator Decimal(Volume value)
{
return value.amount;
}
不仅这不起作用,而且现在证明类型可以用十进制数初始化的测试失败并显示相同的消息:
[TestMethod]
public void VolumeTypeGetsInitializedByDecimalValue()
{
Decimal value = 123456781.1235657789464356m;
Volume volume = value;
Assert.AreEqual(value, volume);
}
这是我第一次尝试这样做,所以我不确定为什么会这样。任何指导表示赞赏。
最佳答案
第一种方式是替换
Assert.AreEqual(value, volume);
与:
Assert.AreEqual((Volume)value, volume);
另一种方法是将断言字符串替换为:
Assert.IsTrue(value.Equals(volume), string.Format("It was expected to get '{0}' but got '{1}'.", volume, value));
并将 ToString 重写为:
public override String ToString(){
return amount.ToString();
}
更新
为了使事情“正确”,除了重写 ToString
方法之外,我还建议重写 Equals
和 GetHashCode
方法并标记 amount
字段为只读:
private readonly decimal amount;
public bool Equals(Volume other)
{
return amount == other.amount;
}
public override bool Equals(object obj)
{
return obj is Volume ? Equals((Volume)obj) : base.Equals(obj);
}
public override int GetHashCode()
{
return amount.GetHashCode();
}
关于c# - C# 中的值类型返回类型而不是基础金额,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24398204/