使用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。如果我隐式使用上面的转换运算符,它将与创建这个结构背后的原因相矛盾。提前感谢。。。

使用c#,如何一次重载所有运算符

必须分别实现所有运算符,但您可以简化过程通过实现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);
  }
}