2014-04-14 6 views
0

У меня есть такая структура.Использование C#, как я могу перегрузить все операторы сразу?

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 я должен перегружать все операторы +, -, <, < =,>,> =, ==, = и т.д.!? Или есть способ принять всех операторов decimal для Money? Как видите, Money имеет только одно поле, которое равно _quantity. Я хочу, чтобы все операторы, запрошенные для Money, возвращались так, как будто его запрашивали _quantity.

Возможно, перегрузка ниже неявного оператора преобразования решит проблему.

public static implicit operator decimal(Money money) 
{ 
    return money._quantity; 
} 

Я создаю Money-структуру, потому что я не хочу использовать decimal во всем моем проекте. Компилятор должен заставить меня использовать Money вместо decimal. Если я неявно использую оператор преобразования, это противоречит основанию создания этой структуры. Спасибо заранее ...

ответ

1

Вы должны реализовать всех операторов отдельно, но вы можете упростить процесс по inmplementing 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); 
    } 
} 
+0

Благодарим за ответ Дмитрия. Но мои методы перегрузки оператора уже имеют структуру 'return left._quantity right._quantity'. Если C# поддерживает общие операторы, а также общие типы, тогда у моего вопроса будет ответ. – serdar

+0

@serdar: Да, отсутствие оператора «<=>» (который может комбинировать все сравнения) и числового типа (для реализации арифметики) иногда раздражает. –

 Смежные вопросы

  • Нет связанных вопросов^_^