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