Οι κυριότεροι αριθμητικοί τελεστές και οι τελεστές σύγκρισης μπορούν να προσαρμοστούν ώστε να χρησιμοποιούνται από τις δικές σου κλάσεις και δομές. Αυτό είναι γνωστό ως υπερφόρτωση τελεστών.
Αυτό το άρθρο συζητά διεξοδικά τη σύνταξη, καθώς και ποιοι τελεστές μπορούν να υπερφορτωθούν και ποιοι όχι.
Οι περισσότεροι τελεστές έχουν τη μορφή:
static <return type> operaator <operator symbols>(<parameters>);
Οι τελεστές μετατροπής έχουν τη μορφή:
static (explicit|implicit) operator <cast-to-type>(<cast-from-type> <parameter name>);
Οι τελεστές συμπεριφέρονται με τον ίδιο τρόπο όπως οι στατικές μέθοδοι.
Παραδείγματα σύνταξης:
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);
}
}
Συχνά είναι αποδοτικό να υλοποιήσεις μια μέθοδο Equals() και να την καλέσεις από τον τελεστή ==. Παρομοίως, για τις συγκρίσεις μπορείς να υλοποιήσεις τη διεπαφή IComparable. Και στις δύο περιπτώσεις, σκοτώνεις δύο πουλιά με ένα σμπάρο και κάτι παραπάνω.
Αξίζει να σημειώσεις ότι δεν μπορείς να δημιουργήσεις τελεστές από σύμβολα που δεν ανήκουν στο βασικό σύνολο τελεστών. Μπορείς να χρησιμοποιήσεις μόνο υπάρχοντα σύμβολα, και μόνο για εκείνες τις πράξεις για τις οποίες η τεκμηρίωση ορίζει ότι μπορούν να υπερφορτωθούν. Οι τελεστές που μπορούν να υπερφορτωθούν αναφέρονται εδώ.
Σημείωσε ότι η σειρά των παραμέτρων έχει σημασία όταν αυτές διαφέρουν ως προς τον τύπο. Στον παραπάνω κώδικα, το pt * 10m είναι νόμιμη έκφραση, ενώ το 10m * pt δεν μεταγλωττίζεται.
Αυτή η τεκμηρίωση για την υπερφόρτωση τελεστών περιγράφει αναλυτικά τη σύνταξη.