2017-01-23 6 views
0

ich folgenden Code haben:Overloading Operator <in C#

public class Foo 
{ 
    public static bool operator<(Foo l, Foo f) 
    { 
     Console.WriteLine("Foo!"); 
     return false; 
    } 
    //public static bool operator>(Foo l, Foo f) 
    //{ 
    // return f < l; 
    //} 
} 

Compiler sagt über Fehler mit der Meldung:

Operator ‚Program.Foo.operator < (Program.Foo, Program.Foo) 'erfordert einen passenden Operator'> ', um auch definiert zu werden

Es scheint sehr seltsam für mich. Warum sollte ich operator> überladen?

+6

Warum ist das komisch? Wenn Sie definieren, ob obj1 kleiner als obj2 ist, sollten Sie auch definieren, ob obj1 größer als obj2 ist. –

+6

würde ich sagen, dass * nicht * überladen beide "komisch" wären. Es würde mich sicher überraschen, dass "a a" ist. –

+0

Werfen Sie einen Blick auf diese Frage: [Warum müssen wir sowohl == als auch! = In C# definieren?] (Http://stackoverflow.com/questions/6916884/why-must-we-define-both-and-in- c) – arbitrarystringofletters

Antwort

3

Von Overloadable Operators:

Die Vergleichsoperatoren, wenn überlastet, müssen paarweise überlastet werden; das heißt, wenn == überladen ist, muss auch! = überladen werden.

Das Umgekehrte ist auch wahr, und ähnlich für < und>, und für < = und> =.

3

Da dieser Operator in Paaren kommt (wie == und !=). Es erwartet, dass Sie beide implementieren, um sicherzustellen, dass Sie es nicht versehentlich vergessen. Wenn Sie sagen, dass < verhält sich anders, > sollte auch, daher sind Sie gezwungen, es auch zu überlasten.

Wie MSDN sagt:

Wenn ein binärer Operator überlastet ist, wird der entsprechende Zuweisungsoperator, falls vorhanden, wird auch implizit überlastet.

0

Ja, wenn Sie den < Operator überlasten, müssen Sie auch > überladen. Es passiert mit anderen Betreibern wie +, -, da die miteinander verwandt sind.

2

Dies ist die Regel für das Überladen von Vergleichsoperatoren. Sie können diese Betreiber Überlastung nur paarweise:

  • == und !=
  • < und >
  • <= und >=

Die Vergleichsoperatoren, wenn überlastet, müssen paarweise überlastet werden ; Das heißt, wenn == überladen ist, muss auch! = Überladen werden. Die umgekehrte ist auch wahr, und ähnlich für < und>, und für < = und> =.

MSDN Source - Overloadable Operators (C# Programming Guide)

2

kann ich spekulieren, dass der Grund, wegen der mathematischen Eigenschaften der Ungleichheit Operatoren ist.https://en.wikipedia.org/wiki/Inequality_(mathematics)

> invers von <

Es wäre nicht verwunderlich, wenn Compiler erlaubt diese Eigenschaften und nimmt man für einen anderen zu tauschen. Und selbst wenn der Compiler dies nicht tun sollte, wäre der resultierende Code nicht zu verwalten.

z. Nehmen Sie Refactoring-Tools als Beispiel - Invertieren von Operatoren ist eine ziemlich häufige Funktionalität in diesen.

+0

> = ist das Gegenteil von <, wenn ich mich nicht irre. Dein Punkt gilt aber. – CSharpie

+0

Es scheint, dass die Umkehrung von ist (siehe Wiki): a a Allerdings ist Gegenteil von (a> b) (a <= b). Das funktioniert jedoch nicht für Nullables ... – bushed