c# - C# 中的值类型返回类型而不是基础金额

标签 c#

我正在创建一个 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 方法之外,我还建议重写 EqualsGetHashCode 方法并标记 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/

相关文章:

c# - 程序集无法在受限制的 AppDomain 中加载

c# - 尝试登录的安全性(防止时间攻击)

c# - 在 asp.net 3.5 中将 Stream 保存到文件的最佳方法?

c# - 序列化包含 List<T> 的 List<T>

c# - 从 TreeView 获取 SelectedItem?

c# - 仅具有限制的正则表达式字符串

C# 从 Firefox 获取 URL 但不使用 DDE

c# - 构建平台目标 AnyCPU EXE 在 64 位机器中仍然显示 32 位 header

c# - 如何在前台应用程序处于事件状态时停止计划任务运行 Windows Phone 8

C# - 在绑定(bind)中从 System.String 转换为 System.Nullable<Sytem.Int32> 时出现问题