Supongamos que tengo una estructura con un solo campo:¿Debo definir cada operador individual?
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);
}
}
Esto funciona muy bien, hasta que yo quiero hacer cosas como esta:
var alpha = Angle.FromDegrees(90);
var beta = Angle.FromDegrees(100);
var inequality = alpha > beta;
var sum = alpha + beta;
var negation = -alpha;
//etc.
Por lo tanto, he implementado IEquatable<in T>
y IComparable<in T>
, pero que todavía no habilitó ningún operador (ni siquiera ==
, <
, >=
, etc.).
Entonces, comencé a proporcionar sobrecargas al operador.
Por ejemplo:
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;
}
Esto funcionó, sin embargo, cuando miraba a todos los operadores que podría sobrecargar concebible (+, -, !, ~, ++, --, true, false, +, -, *, /, %, &, |, ^, <<, >>, ==, !=, <, >, <=, >=
), empecé a sentir que tiene que haber una mejor manera. Después de todo, la estructura solo contiene un campo, y ese campo es un tipo de valor.
¿Hay alguna forma de habilitar todos los operadores de double
de una sola vez? ¿O realmente tengo que escribir a mano todos los operadores que posiblemente quiera?
(Incluso si tuviera dos o tres campos, todavía me gustaría ser capaz de añadir los operadores en un lote ...)
Probablemente se podría añadir a conversiones implícitas (y posiblemente de) el tipo "doble" para hacer eso. Sin embargo, algo en mi cabeza me dice que podría no ser una buena idea y podría generar ambigüedad. –
Si realmente está haciendo esto solo para la conversión de grado y radian, ¿por qué no simplemente tener una clase MathHelper estática que implementa esa característica y simplemente usar doble en lugar de crear una clase que invente otra clase con un nombre diferente? –
@Jeff Mercado, creo que un elenco implícito podría ser justo lo que estoy buscando, en realidad. ¿Consideraría convertir su comentario en una respuesta? Además, si realmente hay una desventaja, realmente apreciaría si pudieras expandirte un poco. Gracias. – devuxer