【发布时间】:2021-12-09 06:04:03
【问题描述】:
我正在使用具有 2 个属性的结构,并且我正在覆盖一些运算符,以便根据它们的“数量”进行比较、加法和减法。
public struct CurrencyAmount
{
private decimal amount;
private string currency;
public CurrencyAmount(decimal amount, string currency)
{
this.amount = amount;
this.currency = currency;
}
public static decimal operator +(CurrencyAmount amount1, CurrencyAmount amount2)
{
if (amount1.currency != amount2.currency) throw new ArgumentException();
return amount1.amount + amount2.amount;
}
public static decimal operator -(CurrencyAmount amount1, CurrencyAmount amount2)
{
if (amount1.currency != amount2.currency) throw new ArgumentException();
return amount1.amount - amount2.amount;
}
我的问题是这个测试没有编译:
[Property]
public void Addition_with_same_currency(decimal value1, decimal value2)
{
var amount1 = new CurrencyAmount(value1, "HD");
var amount2 = new CurrencyAmount(value2, "HD");
var expected = new CurrencyAmount(value1 + value2, "HD");
Assert.Equal(expected, amount1 + amount2);
}
我收到一个 CS1503 错误:参数 1:无法从“CurrencyAmount”转换为“字符串”和参数 2:无法分别从“预期”和“金额 1 + 金额 2”参数转换为“字符串” .
但是这个测试编译并通过了:
[Property]
public void Addition_is_commutative(decimal value1, decimal value2)
{
var amount1 = new CurrencyAmount(value1, "HD");
var amount2 = new CurrencyAmount(value2, "HD");
Assert.Equal(amount1 + amount2, amount2 + amount1);
}
所以加法运算符似乎被正确地覆盖了。我在这里错过了什么?
【问题讨论】:
-
技术要点:您没有 overridden 运算符(而且您不能)。您已经重载它们。 (有机会再看看其他的……)
-
单独 - 如果您将其简化为最小示例,也会有所帮助。我认为没有使用
==、!=、<或>运算符,因此您可以从示例中删除它们。我还认为您的Equals方法没有达到您的预期(并且很可能引发 StackOverflow 异常)。 -
expected是CurrencyAmount,其中amount1 + amount2是decimal,因为重载的operator +返回decimal。您可能应该返回CurrencyAmount和return new CurrencyAmount(amount1.amount + amount2.amount, amount1.currency); -
- 运算符计算错误-=
-
为了简洁起见,我已经编辑了代码
标签: c# overriding operator-keyword assert