Les principaux opérateurs arithmétiques et de comparaison peuvent être adaptés pour être utilisés par vos propres classes et structures. C'est ce qu'on appelle la surcharge d'opérateurs.
Cet article traite en détail de la syntaxe, ainsi que des opérateurs qui peuvent être surchargés et de ceux qui ne le peuvent pas.
La plupart des opérateurs ont la forme suivante :
static <return type> operaator <operator symbols>(<parameters>);
Les opérateurs de conversion ont la forme suivante :
static (explicit|implicit) operator <cast-to-type>(<cast-from-type> <parameter name>);
Les opérateurs se comportent de la même manière que les méthodes statiques.
Exemples de syntaxe :
struct Point
{
decimal x;
decimal y;
public static bool operator ==(Point pt, Point ptOther)
{
return pt.x == ptOther.x && pt.y == ptOther.y;
}
public static bool operator !=(Point pt, Point ptOther)
{
return !(pt == ptOther);
}
public static Point operator *(Point pt, decimal scale)
{
var ptNew = new Point();
ptNew.x = pt.x * scale;
ptNew.y = pt.y * scale;
return ptNew;
}
public static implicit operator Point((decimal x, decimal y) xy)
{
var pt = new Point();
pt.x = xy.x;
pt.y = xy.y;
return pt;
}
public static explicit operator (decimal x, decimal y)(Point pt)
{
return (pt.x, pt.y);
}
}
Il est souvent judicieux d'implémenter une méthode Equals() et de l'appeler depuis l'opérateur ==. De même, pour les comparaisons, tu peux implémenter l'interface IComparable. Dans les deux cas, tu fais d'une pierre deux coups, avec à peine plus d'une pierre.
Note que tu ne peux pas créer d'opérateurs à partir de symboles qui ne font pas partie de l'ensemble standard des opérateurs. Tu ne peux utiliser que des symboles existants, et uniquement pour les opérations dont la documentation précise qu'elles peuvent être surchargées. La liste des opérateurs qui peuvent être surchargés se trouve ici.
Note que l'ordre des paramètres est important lorsqu'ils sont de types différents. Dans l'exemple de code ci-dessus, pt * 10m est une expression valide, alors que 10m * pt ne compilera pas.
Cette documentation sur la surcharge d'opérateurs détaille la syntaxe.