Предположим, у меня есть структура с одним полем:
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
одним выстрелом? Или мне действительно придется набирать вручную все операторы, которые я мог бы захотеть поддерживать?
(Даже если бы у меня было два или три поля, я бы все равно хотел иметь возможность добавлять операторы одним пакетом... )