2013-06-04 7 views
8

In C# gibt es keinen integrierten Begriff der Kommutativität in der Sprache. Das ist, wenn ich eine einfache Vector Klasse zum Beispiel definieren:Kommutativität in Operatoren

public struct Vector 
{ 
    private readonly double x, y, z; 
    ... 

    public static Vector operator +(Vector v, double d) {...} 
} 

Ich werde noch den symmetrischen Operator +(double d, Vector v) oder ein beliebigen Ausdruck des Formulars definieren muß 2.1 * v einen Übersetzungsfehler geben oder zur Laufzeit in einem dynamischen Szenario fehlschlagen.

Meine Frage ist zweifach: Erstens, gibt es Sprachen, in denen man kommutative Operatoren definieren kann, ohne beide möglichen Operandenkombinationen definieren zu müssen? Mit anderen Worten, gibt es Sprachen, die sich des Begriffs der Kommutativität bewusst sind? Und zweitens, wurde es jemals in C# berücksichtigt und verschrottet, da es wirklich nur syntaktischer Zucker ist, um ein paar zusätzliche Tastenanschläge zu vermeiden, die der Sprache nicht wirklich viel hinzufügen (und höchstwahrscheinlich ein zusätzliches reserviertes Wort benötigen würden)?

+1

Kommutativität mit einer Zeile definieren: 'public static Vektoroperator + (double d, Vektor v) {return v + d;}' –

+0

Ich glaube, dass Haskell dies sofort unterstützt. Das und Prolog. Es ist fast 8 Jahre her, also könnte ich mich irren. – Haney

+0

Überprüfen Sie diese Frage (und Antworten) http://stackoverflow.com/questions/7385937/why-must-i-define-a-kommutative-operator-twice –

Antwort

7

Gibt es Sprachen, in denen Sie kommutative Operatoren definieren können, ohne beide möglichen Operandenkombinationen definieren zu müssen?

Ich bin mir nicht bewusst, aber das heißt nicht, dass sie nicht existieren.

War es jemals in C# und verschrottet betrachtet, wie es wirklich nur syntaktischer Zucker ist, ein paar zusätzliche Tastenanschläge zu vermeiden, die wirklich nicht allzu viel Reichtum der Sprache hinzufügen (und würde höchstwahrscheinlich benötigen ein zusätzliches reserviertes Wort)

Nach meinem Wissen wurde es nie berücksichtigt. Es war sicherlich nie auf der Liste der möglichen Sprachverbesserungen und ich kann mich nicht daran erinnern, es im Archiv der Design-Notizen gesehen zu haben.

Sie machen ein ausreichendes Argument gegen das Feature in Ihrer Frage. Wenn ich gebeten würde, eine zusätzliche Kritik des vorgeschlagenen Merkmals zu geben, würde ich darauf hinweisen, dass viele überlastete Operatoren nicht kommutativ sind, selbst wenn ihre mathematischen Gegenstücke kommutativ sind. Der String "addition" zum Beispiel ist eindeutig nicht kommutativ, obwohl beide Operanden Strings sind. Und das gleiche gilt für den Delegierten "Zusatz". Und es gibt viele andere Eigenschaften von Operatoren, die ebenso nützlich oder besser wären, als dass ich sie vor der automatischen Kommutation einsetzen würde.

+1

Vielen Dank für das Posten. Ich habe mir diese Funktion lange in 'C#' gewünscht. Vielleicht über ein Attribut oder ein Schlüsselwort (wie implizit für Konvertierungsoperatoren verwendet wird). – ja72