Должен ли я определять каждый отдельный оператор?

Предположим, у меня есть структура с одним полем:

public struct Angle
{
    public static readonly double RadiansPerDegree = Math.PI / 180;

    private readonly double _degrees;

    public Angle(double degrees)
    {
        _degrees = degrees;
    }

    public double Degrees
    {
        get { return _degrees; }
    }

    public double Radians
    {
        get { return _degrees * RadiansPerDegree; }
    }

    public static Angle FromDegrees(double value)
    {
        return new Angle(value);
    }

    public static Angle FromRadians(double value)
    {
        return new Angle(value / RadiansPerDegree);
    }
}

Это работает отлично, пока я не захочу сделать что-то вроде этого:

var alpha = Angle.FromDegrees(90);
var beta = Angle.FromDegrees(100);
var inequality = alpha > beta;
var sum = alpha + beta;
var negation = -alpha;
//etc.

Итак, я реализовал IEquatable и IComparable, но это все равно не дало возможности использовать какие-либо операторы (даже ==, <, >= и т.д.). ).

Поэтому я начал предоставлять перегрузки операторов.

Например:

public static Angle operator +(Angle a, Angle b)
{
    return new Angle(a._degrees + b._degrees);
}

public static Angle operator -(Angle a)
{
    return new Angle(-a._degrees);
}

public static bool operator >(Angle a, Angle b)
{
    return a._degrees > b._degrees;
}

Это работало, однако, когда я посмотрел на все операторы, которые я мог бы перегрузить (+, -, !, ~, ++, --, true, false, +, -, *, /, %, &, |, ^, <<, >>, ==, !=, <, >, <=, >=), я начал чувствовать, что должен быть лучший способ. В конце концов, структура содержит только одно поле, и это поле - тип значения.

Есть ли способ включить все операторы double одним выстрелом? Или мне действительно придется набирать вручную все операторы, которые я мог бы захотеть поддерживать?

(Даже если бы у меня было два или три поля, я бы все равно хотел иметь возможность добавлять операторы одним пакетом... )

9
задан devuxer 19 January 2012 в 06:48
поделиться