使用c#,如何一次重载所有运算符
本文关键字:运算符 重载 何一次 使用 | 更新日期: 2023-09-27 17:58:21
我有一个这样的结构。
public struct Money
{
private readonly decimal _quantity;
private Money(decimal qty)
{
_quantity = Math.Round(qty, 2);
}
public static implicit operator Money(decimal dec)
{
return new Money(dec);
}
}
对于Money
,我是否必须重载所有运算符+、-、<lt;=,>,>=,==,!=,等或者有没有一种方法可以接受decimal
的所有运算符用于Money
?如您所见,Money
只有一个字段,即_quantity
。我希望所有要求Money
的操作员都应该像要求_quantity一样返回。
也许在隐式转换运算符下面重载可以解决这个问题。
public static implicit operator decimal(Money money)
{
return money._quantity;
}
我正在创建Money
结构,因为我不想在整个项目中使用decimal
。编译器应该强制我使用Money
而不是decimal
。如果我隐式使用上面的转换运算符,它将与创建这个结构背后的原因相矛盾。提前感谢。。。
您必须分别实现所有运算符,但您可以简化过程通过实现static Compare
方法(为了模拟C#不支持的<=>
运算符):
public struct Money: IComparble<Money> {
private readonly decimal _quantity;
...
// C# doesn't have <=> operator, alas...
public static int Compare(Money left, Money right) {
if (left._quantity < right._quantity)
return -1;
else if (left._quantity > right._quantity)
return 1;
else
return 0;
}
public static Boolean operator == (Money left, Money right) {
return Compare(left, right) == 0;
}
public static Boolean operator != (Money left, Money right) {
return Compare(left, right) != 0;
}
public static Boolean operator > (Money left, Money right) {
return Compare(left, right) > 0;
}
public static Boolean operator < (Money left, Money right) {
return Compare(left, right) < 0;
}
public static Boolean operator >= (Money left, Money right) {
return Compare(left, right) >= 0;
}
public static Boolean operator <= (Money left, Money right) {
return Compare(left, right) <= 0;
}
public int CompareTo(Money other) {
return Compare(this, other);
}
}