Operator-Overloading
-
Hey Freunde der Sonne,
seit wann gibt es in .NET "Operator-Overloading" ??
Als ich den Type "Double" in der MSDN angschaut habe, sah ich dass da die operatoren überladen wurden.. dann hab ich es in einer meiner klasse impkementiert
class Test { public static bool operator ==(Test left, Test right) { return right.Equals(left); } public static bool operator !=(Test left, Test right) { return !right.Equals(left); } }
und es scheint zu gehen.. aber ich erinnere mich dass es im .NET 3.5 nich ging? oder lag ich falsch?:)
grüßle
-
Hallo
Doch das geht schon relativ lange es weis nur fast keiner. Nach Doku von Microsoft schon mit 2.0, siehe hier: https://msdn.microsoft.com/de-de/library/aa288467(v=vs.71).aspx
Mfg Marco
-
NullBockException schrieb:
seit wann gibt es in .NET "Operator-Overloading" ??
Naja, in .NET gibt es das in dem Sinne eigentlich nicht, als dass man damit nicht CLS-compliant ist, d.h. es müssen nicht alle Sprachen operator overloading unterstützen und es tun auch nicht alle.
C# als eine der Sprachen, die es unterstützen, hat es seit Release 1.0 immer schon gehabt.
-
Coole sache;)
-
@NullBockException
Anm.: Deine Implementierung geht nicht korrekt mitnull
Werten um.@copperator
.NET ist für mich die Plattform, also das Framework, die Spezifikation der IL und VM usw. Und da ist AFAIK ein standardisierter Mechanismus definiert wie man Operator Overloading zu machen hat.Dass den nicht alle CLS compliant Sprachen unterstützen müssen ist wieder 'was anderes.
Nach deiner Argumentation müsste man sonst auch sagen ".NET kann keine unsigned Typen". Was irgendwie Blödsinn ist. .NET "kann" natürlich unsigned Typen, es verlange bloss nicht von jeder Sprache sie zu unterstützen.
-
@Hustbaer: Danke für die Anmerkung, war ja um rumzuspielen;) Aber wie wäre denn das korrekte verhalten, wenn eines der Ojekte null wäre?
-
-
NullBockException schrieb:
@Hustbaer: Danke für die Anmerkung, war ja um rumzuspielen;) Aber wie wäre denn das korrekte verhalten, wenn eines der Ojekte null wäre?
Die Frage ist jetzt nicht ernst gemeint, oder?
-
hustbaer schrieb:
NullBockException schrieb:
@Hustbaer: Danke für die Anmerkung, war ja um rumzuspielen;) Aber wie wäre denn das korrekte verhalten, wenn eines der Ojekte null wäre?
Die Frage ist jetzt nicht ernst gemeint, oder?
Ich schätze mal es war ernst gemeint.
@NullBockException:
Ist die Instanz auf der du Equals aufrufst null, wird dir eine NullReferenceException um die Ohren gehauen. - Das sollte dir helfen um herauszufinden, wie die Methode richtig aussehen müsste.
-
`null == null -> true
nonnull == null -> false
null == nonnull -> false
nonnull == nonnull -> Objekte Vergleichen`
Das wäre das übliche Verhalten.
Ansonsten programmiert man es halt so wie man es haben will, obwohl vermutlich kaum etwas anderes Sinn machen wird.
Was auf jeden Fall unerwartet wäre: wenn beia == b
eine Exception fliegt wenna
oderb
(oder beide)null
sind.
-
Ja das nächste mal denk ich etwas nach;)
Aber Ihr hört euch doch auch gern reden oder nich :p :p
-
hustbaer schrieb:
`null == null -> true
nonnull == null -> false
null == nonnull -> false
nonnull == nonnull -> Objekte Vergleichen`
Wobei das garnicht so einfach ist, wie ich gerade im Test heraus bekommen habe.
Folgendes hatte ich probiert:
class Test { public static bool operator ==(Test left, Test right) { if((left == null && right != null) || (left != null && right == null)) return false; else return left.Equals(right); } // ... }
Welches Problem tritt auf?
Es kommt zu einer StackOverFlow-Exception, da ja der neue Operator für den Vergleich left == null aufgerufen wird. Den rest kannst dir sicher denken. - Mir fällt aber auch gerade kein Effizienter weg ein, das zu umgehen.// Edit:
Ah wait, found a way:[code="cs"] class Test { public static bool operator ==(Test left, Test right) { if(((object)left == null && (object)right != null) || ((object)left != null && (object)right == null)) return false; else return left.Equals(right); } // ... }
[/code]
-
Es gibt auch noch
Object.ReferenceEquals
ps:
public static bool operator ==(Test left, Test right) { if (object.ReferenceEquals(left, null)) return object.ReferenceEquals(right, null); else return left.Equals(right); // Equals must do a null-check for right anyway, so we don't have to repeat it here }